2017-06-06 4 views
2

Ich habe eine übliche Spring Data JPA-Repository in meinem Frühjahrsprojekt.Federdaten JPA. Finden Sie in

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

Ich verwendete vor der Methode findByOriginalIdIn es funktionierte gut. Aber die Situation ist geändert und ich muss dieselbe Anfrage mit der Sammlung von Paaren bearbeiten, um korrekte Ereignisse zu finden und zu filtern.

sollte Meine alternative Methode nächste logische Griff: find by (originalId1 AND originalCalendarId1) OR (originalId2 AND originalCalendarId2) OR (originalId..N AND originalCalendarId..N) OR

Ist es möglich diese Anforderung behandeln Selectively exposing CRUD methods mit? Wenn ja, könnte ich bitte ein Beispiel haben?

+0

haben Sie versucht 'findByOriginalIdInOrOriginalIdInOrOriginalIdIn (...)' ?? aber um ehrlich zu sein, ich denke, dass crietria api wäre viel einfacher und direkt zu verwenden – Antoniossss

+0

Check out [this] (https://stackoverflow.com/questions/43780226/spring-data-ignore-parameter-if-it-it- has-a-null-Wert/43781418 # 43781418) Frage –

Antwort

1

Um keine benutzerdefinierten Repository erstellen I Spring Data JPA Spezifikationen verwenden würde empfehlen. Hier ist ein Beispielentwurf.

 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(...)); 

Zusätzlich muss Ihr Repository JpaSpecificationExecutor erweitern.

0

Versuchen Kriterien mit folgenden Einschränkungen zu verwenden:

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

Ich würde vorschlagen, QueryDSL mit Spring JPA zu verwenden, um Ihre Implementierung auf einfache Weise zu machen.

Mit QueryDSL können Sie leicht Ihr Prädikat (nichts als die Kriterien) erstellen und in der Abfrage verwenden. In Ihrem Fall wäre es wahrscheinlich so etwas wie unten. Bitte beachten Sie den Link: Spring Data JPA Tutorial: Creating Database Queries With Querydsl zur Verwendung von QueryDSL mit Spring Data JPA.

In Ihrem Fall für bestimmte Bedingung,

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

Ich verstand nicht, wenn z.B. originalId1/originalCalendarId1 sollte einem beliebigen Wert entsprechen. Nehmen wir an, aus Gründen der Einfachheit und Erklärung, sie sind gleich zu einem Wert.

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; 
    } 
} 

Allerdings sollten Ihre Repository-Schnittstelle QueryDslPredicateExecutor<Event> erweitern Nutzung der QueryDSL Funktionalität zu machen.

In Ihrer Service-Methode, können Sie den Anruf so etwas wie machen unter EventRepository unter der Annahme, wie weiter unten erklärt wird:

@Autowired 
EventRepository eventRepository; 

public void someMethod(){ 

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

} 

Btw, QueryDSL macht es sehr einfach, verschiedene Kriterien (einfach bis komplex) zu implementieren. Lesen Sie den obigen Link zur Verwendung.

Hoffe, das hilft.

Verwandte Themen