2017-06-06 9 views
2
で検索

私は春のプロジェクトで通常のSpring Data JPAリポジトリを持っています。スプリングデータJPA。

@Repository 
public interface EventRepository extends CrudRepository<Event, Long> { 
    List<Event> findByOriginalIdIn(Collection<String> originalEventIds); 
    ... 

私は方法の前に使用しましたfindByOriginalIdInこれはうまくいきました。しかし、状況が変わり、正しいイベントを見つけてフィルタリングするために、ペアのコレクションを使用して同じリクエストを処理する必要があります。

私の別の方法は、次のロジックを処理する必要があります find by (originalId1 AND originalCalendarId1) OR (originalId2 AND originalCalendarId2) OR (originalId..N AND originalCalendarId..N) OR

は、それがSelectively exposing CRUD methodsを使用してこの要求を可能に扱いますか?はいの場合は、私に例を挙げてもらえますか?

+0

'findByOriginalIdInOrOriginalIdInOrOriginalIdIn(...)'を試してみましたか?正直言って、私は、crietria apiがはるかにシンプルで使いやすくなると思っています。 – Antoniossss

+0

[this](https://stackoverflow.com/questions/43780226/spring-data-ignore-parameter-if-it- has-a-null-value/43781418#43781418)質問 –

答えて

1

私は春データJPAの仕様を使用することをお勧めしますカスタムリポジトリを作成しないために。 ここに草稿の例があります。

 class Specification1 implements Specification<Event> {    
      private final List<Pair<String, String>> pairs; 

      public Specification1(List<Pair<String, String>> pairs) { 
       this.paris = pairs; 
      } 

      @Override 
      public Predicate toPredicate(Root<Event> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 


       Predicate[] as = pairs.stream().map(pair -> { 
        return cb.and(cb.equal(root.get("originalId2"), pair.getKey())),cb.equal(root.get("originalCalendarId2"), pair.getKey()); 
       }).toArray(Predicate[]::new); 

       return cb.or(as); 
      } 
     } 


     userRepository.findAll(new Specification1(...)); 

さらに、JpaSpecificationExecutorを拡張する必要があります。

0

は、以下の制限が基準を使用してみてください:

Criteria criteria = session.createCriteria(Event.class) 
        .add(Restrictions.in("id", values)); 
0

Spring JPAでQueryDSLを使用して簡単に実装することをお勧めします。

QueryDSLを使用すると、簡単に述語を作成して(条件を除く)問合せで使用できます。あなたの場合、それはおそらく以下のようなものでしょう。 Spring Data JPAでQueryDSLを使用する方法については、Spring Data JPA Tutorial: Creating Database Queries With Querydslのリンクを参照してください。与えられた条件のために、あなたのケースで

find by (originalId1 AND originalCalendarId1) OR (originalId2 AND originalCalendarId2) OR (originalId..N AND originalCalendarId..N) OR 

例えばあれば、私は理解していませんでしたoriginalId1/originalCalendarId1は任意の値と等しくなければなりません。簡潔さと説明のためにとしましょう。、それらはある値と等しくなければなりません。

import com.mysema.query.BooleanBuilder; 
import com.mysema.query.types.Predicate; 

public class EventPredicates { 

    public static Predicate getAllEventsByOrginalIds(String[] originalIds, String[] originalCalendarIds) { 
     QEvent event = QEventEntity.event; 

     BooleanBuilder builder = new BooleanBuilder(); 

     //assuming both arrays are of same size. 
     for (int idx = 0; idx < originalIds.length; idx++) { 
      builder.or(event.originalIds[0].eq.(someValue)).and(event.originalCalendarIds[0].eq.(someCalValue)); 
     } 
     return builder; 
    } 
} 

ただし、QueryDSL機能を使用するには、リポジトリインターフェイスをQueryDslPredicateExecutor<Event>に拡張する必要があります。あなたのサービスの方法で

、あなたが作ることができるEventRepositoryを想定して、以下のような呼び出しの何かが以下のように宣言されます。

@Autowired 
EventRepository eventRepository; 

public void someMethod(){ 

    ... 
    List<Events> events = eventRepository.findAll(EventPredicates.getAllEventsByOrginalIds(originalIdsArr, originalCalendarIdsArr)); 
    ... 

} 

ところで、QueryDSLは(複雑にシンプルな)異なる基準を実装することが非常に容易になります。それを使用する方法については上記のリンクを参照してください。

これが役に立ちます。

関連する問題