2017-11-30 8 views
2

Ich habe zwei Tabellen/Entitäten. Alles funktioniert gut (Getter und Setter weggelassen).ManyToMany Abfrage in JPA

@Entity 
    public class Book() { 
    @Id; 
    int id; 
    @ManyToMany 
    List<Category> categories; 
} 

@Entity 
public class Category { 
    @Id 
    int id; 
    @ManyToMany 
    List<Book> books; 
} 

JPA/Hibernate schafft Struktur Datenbank mit einer Tabelle namens book_category beitreten zu erwarten, dass die Felder book_id und category_id enthält.

Kategorien werden im Voraus erstellt, damit nicht alle Bücher haben. Ich möchte verschiedene Kategorien abfragen, in denen sich Bücher befinden.

Die folgende SQL-Abfrage funktioniert es:

SELECT DISTINCT <things> FROM book_category JOIN category ON category.id = book_category.category_id 

Aber wie kann ich die Liste der Kategorien aus dem Repository zu bekommen?

Antwort

2

Wenn Sie alle Kategorien wollen die Bücher zugewiesen sind, dann denke ich, Sie nur eine Abfrage auf die Category Einheit benötigen, die die Größe seiner Büchersammlung überprüft:

select c from Category where size(c.books) > 0 

Auch wenn die Verknüpfungstabelle abfragt direkt wäre möglich, z über eine native Abfrage glaube ich nicht, dass dies als gute JPA-Praxis angesehen werden würde. Vielmehr sollten Ihnen die beiden bereits vorhandenen Viele-zu-Viele-Entitäten ermöglichen, die von Ihnen benötigten Abfragen auszuführen.

+0

Also habe ich versucht, dies in der Kategorie Repository 'Liste findDistinctByBookIsGreaterThan (int i)' aber es gibt mir ein 'NoSuchElementException' – jared

+0

Ist eine direkte JPQL Abfrage keine Option? –

+0

@jared Ich kenne die genau benannte Methodensyntax für meine Antwort nicht. Sie sollten JPQL jedoch bei Bedarf immer direkt verwenden können. –

0

Wie ich verstanden habe, möchten Sie ein JPA-Repository für Ihre Kategorien. Dadurch wird ein Repository erstellt, und Sie können es verwenden, um die Kategorien abzurufen, in denen sich Bücher befinden. Sie müssen nur die Buch-ID erhalten. JPA ist sehr flexibel, also ist das vielleicht nicht genau das, was Sie wollen, aber probieren Sie es selbst aus.

public interface CategoryRepository extends JpaRepository <Category, Integer> 
{ 
    List<Category> findByBookId(Integer book); 
} 

EDIT: Alles klar, es war ein langer Tag und ich bin müde af. Wie wäre es, wenn Sie das Gegenteil versuchen?

public interface BookRepository extends JpaRepository <Book, Integer> 
{ 
    List<Book> findAllByCategoryId(Integer category); 
} 

dann überprüfen, ob es null ist oder nicht.

+0

Aber ich möchte alle Kategorien, die Bücher enthält, unabhängig davon, welches Buch es ist. – jared

+0

Dieser Code findet alle Kategorien, in denen sich ein Buch befindet und zeigt sie an. Es wird kein Buch finden, wenn es keine Bücher gibt. „Liste categroyList = categoryRepository.findByBookId (BookID)“ Dazu einfach einen Scheck, um zu sehen, ob Category leer ist, dann sollte es nicht im Modell zeigen. Wenn du kannst, poste deinen Controller, damit ich sehen kann, was du genau machst. Ich meine, das ist was du suchst, oder? Wenn die Kategorie leer ist, sollte sie nicht angezeigt werden? Wenn es Bücher gibt, sollte es zeigen – Sibuscus

+0

Siehe meine Bearbeitung, ich werde nur bis morgen aufhören, wenn ich wieder klar denken kann. – Sibuscus