Ruhezustand: Wählen Sie Elemente aus, wo die Sammlung enthält alle angegebenen Werte
Ich brauche Hilfe bei einem kniffligen hibernate-query-problem. Ich habe die folgenden Entitäten:
public class Book {
private String bookId;
private String author;
private String isbn;
private Set<Tag> tags;
//getters, setters etc.
}
und
public class Tag {
private String tagId;
private String tagName;
//getters, setters, etc.
}
Gibt es eine viele-zu-viele-Assoziation zwischen den beiden, die dargestellt wird durch eine join-Tabelle books_tags_mn mit den Spalten book_id und die tag_id.
Was ich gerne mache ist Folgendes: ich möchte ein hibernate-query/Kriterien Abfrage, liefert alle Buch haben alle von einem bestimmten Satz von tags. Was funktioniert ist, wählen Sie " alle Bücher, die alle einer Reihe von tags.
Ich ve wurde Herumspielen mit der criteria API, aber es war nicht wirklich zu verstehen. Also, was ich versuche zu tun (in pseudo HQL)
from Book book where book.tags containsAll(:tags)
Jede Hilfe auf diesem würde sehr geschätzt werden, so ich danke Ihnen sehr im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie die folgende Abfrage verwenden:
wo
numberOfTags
ist die Anzahl von tags in dem Satz von tags, die abgestimmt werden müssen.Ich würde die Ratschläge, die Sie erstellen zwei benutzerdefinierte Funktionen oder Einschränkung, wie :
Einmal Funktionen sind definiert und registriert, Sie wäre in der Lage zu laufen HQL - /Kriterien-Abfrage wie:
oder
Bitte Beachten Sie: Dies ist nur ein Beispiel pseudo-code-teilen, die Idee.
Hoffe, das hilft!
Die akzeptierte Antwort von JB Nizet ist gut, aber wird nicht funktionieren, wenn Sie Ihre Sammlung können Duplikate enthalten (möglicherweise ein triftiger Grund für, die, wahrscheinlich nicht mit dem tag Beispiel wenn).
Können sagen, dass die Sammlung für einige Bücher enthalten kann, die doppelten tags mit dem gleichen Namen "MyTag". Dann eine Suche nach den Tags "MyTag", "YourTag" könnte die Rückgabe der Bücher " 2 "MyTag" - tags, aber keine "YourTag" - tag.
Wie gesagt nichts falsch mit der akzeptierten Antwort, aber wenn Sie brauchen, um Unterstützung für Duplikate in der Sammlung, dann müssen Sie count(distinct tag.name)