2014-02-12 5 views
6

Gibt es eine Möglichkeit, die von Spring Data Rest ausgeführte findAll-Abfrage zu überschreiben?@NamedQuery überschreiben findAll im Frühjahr Datenrest JpaRepository

Ich brauche eine Möglichkeit, die Ergebnisse auf der Grundlage bestimmter Kriterien zu filtern, und es scheint, dass die Verwendung einer @NamedQuery sollte in der Linie von dem, was ich suche, so dass ich einen Test einrichten.

@Entity 
@Table(name = "users") 
@NamedQueries({ 
    @NamedQuery(name = "User.findAll", query="SELECT u FROM User u WHERE u.username = 'test'"), 
    @NamedQuery(name = "User.findNameEqualsTest", query="SELECT u FROM User u WHERE u.username = 'test'") 
}) 
public class User implements Serializable, Identifiable<Long> { } 

In diesem Ort würde ich SDR erwartet, dass mein findAll() Abfrage (Rückkehr 1 Ergebnis) verwenden, sondern führt es die gleiche alte findAll Logik (alle Ergebnisse zurückkehrt).

In meinem Repository ich hinzugefügt:

@Repository 
@RestResource(path = "users", rel = "users") 
public interface UserJpaRepository extends JpaRepository<User, Long> { 

    public Page<User> findNameEqualsTest(Pageable pageable); 
} 

und in diesem Fall gilt für den Umfang vorgesehen @NamedQuery abholen. So ...

Wie sollte ich die Standardlogik findAll() übergehen? Ich muss tatsächlich einen komplexen Satz von Kriterien konstruieren und auf die Ergebnismenge anwenden.

Antwort

3

Ja, können Sie Ihre Implementierung Ihrer Repository-Schnittstelle erstellen, ist es acouple Abschnitt in

http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/repositories.html#repositories.custom-implementations

Repository

@Repository 
    public interface PagLogRepository extends JpaRepository<PagLogEntity, Long>, PagLogCustomRepository { 

Custom Interface

public interface PagLogCustomRepository { 
PagLogEntity save(SalesForceForm salesForceForm) throws ResourceNotFoundException; 

Individuelle Implementierung

public class PagLogRepositoryImpl implements PagLogCustomRepository { 
@Override 
    public PagLogEntity save(final SalesForceForm salesForceForm) throws ResourceNotFoundException { 

     query = emEntityManager.createNamedQuery("findItemFileByDenormalizedSku", ItemFileEntity.class); 
     query.setParameter("skuValue", rawSku); 

Statt Überschreibung speichern Sie es mit findAll machen, dann können Sie komplexe Anpassung erstellen

+0

Implementiert und es funktioniert. Hämmerte meinen Kopf ein wenig gegen die Tastatur, bis ich die Bedeutung von Klassennamen in diesem Prozess erkannte. –

+0

In der Tat, es ist ein sehr häufiges Problem, mehrmals in SOverflow gefragt, Tutorial sollte eine Notiz enthalten – Koitoer

+1

Ab Frühjahr Data JPA 1.5 wird die benutzerdefinierte Implementierung nicht mehr notwendig sein, um dies zu erreichen. Einzelheiten finden Sie unter [meine Antwort] (http://stackoverflow.com/a/21751130/18122). –

10

In der kommenden Version 1.5 von Spring Data JPA (ein RC in unseren Meilenstein-Repositories verfügbar ist) können Sie einfach neu deklarieren die Methode in Ihrer Repository-Schnittstelle und kommentieren Sie sie mit @Query, so dass die Ausführung als Abfrage-Methode ausgelöst wird. Dies wird dann bewirken, dass die benannte Abfrage nur nachgeschlagen werden, wie Sie bereits von Abfragemethoden gewohnt sind:

interface UserJpaRepository extends PagingAndSortingRepository<User, Long> { 

    @Query 
    List<User> findAll(); 

    Page<User> findNameEqualsTest(Pageable pageable); 
} 

Ein paar Notizen auf dem Repository-Deklaration:

  • Sie brauchen nicht zu beschriften Sie die Schnittstelle mit @Repository. Diese Anmerkung hat hier keinerlei Wirkung.
  • Ihre Annotation @RestResource konfiguriert den Exporteur auf eine Weise, die sowieso in Spring Data REST 2.0 (auch in RC bereits) der Standard ist. Ging vorwärts, lieber @RestRepositoryResource, aber wie gesagt: die Pluralisierung wird sowieso die Vorgabe sein.
  • Wir empfehlen generell nicht, die speicherspezifischen Schnittstellen zu erweitern, sondern CrudRepository oder PagingAndSortingRepository.
+1

Sehr geschätzt, Oliver! Ich habe letzte Nacht deine Deepdive-Gespräche gesehen, und das hat wirklich geholfen, einiges für mich zu klären. Ich werde heute einige Änderungen vornehmen, um Ihre Best Practices besser umzusetzen. –