2016-11-30 6 views
0

Hier ist ein generisches Problem: Ich möchte irgendwie eine JpaRepository-Instanz erhalten, die nicht alle Daten aus einer Tabelle, sondern eine benutzerdefinierte gefilterte Menge von Daten liefern wird. Mit anderen Worten, der gleiche Effekt kann erreicht werden, wenn ich irgendwie eine AND-Bedingung an jede Abfragemethode eines bestimmten JpaRepository anhängen könnte.Parametric JpaRepository (oder "Subrepository")

ist auf ein Beispiel Schauen wir hoffen, dass es meine Frage hilft zu verstehen:

Geist DB mit Buch und Benutzertabellen. Jede Buch-Entität hat einige Eigenschaften wie Titel, Beschreibung, Seitenzahl, Autor und Besitzer das ist @ManyToOne (ein Besitzer haben viele Bücher). Das heißt, die Daten der Buch-Tabelle werden logisch durch einen Eigentümer in große Gruppen aufgeteilt. In meinem Code erstelle ich die Schnittstelle BookRepository mit Abfrage-Methoden wie findByName(String), findByAuthor(String), aber ich möchte immer zurückgegebene Bücher von einigen Benutzer (Besitzer), die ich im Moment dienen unterscheiden. Dann muss ich meine Methoden zu findByNameAndOwner(String,User), findByAuthorAndOwner(String,User) und so weiter ändern. Das ist hässlich und es fühlt sich an, als ob ich ein paar nette Spring Data oder JPA Features vermisse.

Gibt es eine Möglichkeit, etwas Repository Fabrik zu haben, wie:

User someOwner = ...; 
BookRepository repo = BookByOwnerRepositoryFactory.getRepositoryFor(someOwner); 

wo BookRepository noch wie folgt aus:

interface BookRepository extends JpaRepository<Book,Long> 
{ 
    List<Book> findByName(String name); 
    List<Book> findByAuthor(String author); 
    ... 
} 

verwendet:

List<Book> javaBooks = repo.findByName("Effective Java"); 

aber javaBooks werden Bücher enthalten im Besitz von someOwner nur, und effektiv re Sult einer solchen Abfrage:

select b from Book b where b.name='Effective Java' and b.owner_id=42

wo 42 someOwner.id ist. Wie Sie sehen, sollte der letzte Teil and b.owner_id=42 intern an jede Abfrage angehängt werden, die für die Abfragemethoden BookRepository generiert wurde.

+0

Ich denke dieser Ansatz geht gegen die Art, wie Spring Data JPA verwendet werden soll. Sie verstecken die Hälfte der Informationen von jemandem, der sich den Code ansehen könnte, und das ist nicht gut. Noch wichtiger ist, dass dies bedeutet, dass Sie jedes Mal, wenn der Service aufgerufen wird, eine neue Instanz erstellen, die viel unnötigen Overhead hinzufügt, wenn Sie sie einfach als Singletons behalten können. – Vaelyr

Antwort

0

können Sie versuchen, Querydsl oder Spezifikationen wie here

In Repository verwenden Sie Methode findAll haben, die als Parameter Bedingungen.

Verwandte Themen