2009-08-14 13 views
4

Ich möchte die Kriterien-API von Hibernate verwenden, um genau das zu erreichen, was wahrscheinlich jeder Benutzer als wahrscheinlichste Anwendungsfall nennt, indem komplexe Suchkriterien angewendet werden. Problem ist, dass die Tabelle, für die ich abfragen möchte, nicht vollständig aus Grundwerten besteht, sondern teilweise aus anderen Objekten, und ich muss die IDs dieses Objekts abfragen.Unterstützt die Kristen-API von Hibernate noch keine verschachtelten Relationen?

Ich fand this article von 2 Jahren, die darauf hindeutet, dass es nicht möglich ist. Hier ist, wie ich es vergeblich versuchte, es gibt andere Aspekte von Hibernate, wo ich weiß, wo diese Art von Punktnotation innerhalb von String-Literalen unterstützt wird, um die Objektverschachtelung anzuzeigen.

if (!lookupBean.getCompanyInput().equals("")) { 
     criteria.add(Restrictions.like("company.company", lookupBean.getCompanyInput() + "%")); 
    } 

EDIT:

Hier ist meine richtig einkalkuliert Code für die Erfüllung, was ich oben versuchte, unter den Vorschlag von der ersten Antwort verwendet wird; beachten Sie, dass ich noch einen zusätzlichen createCriteria Aufruf zur Ordnung in einer weiteren zugehörigen Objekt/Tabelle auf einem Attribute bin mit:

if (!lookupBean.getCompanyValue().equals("")) { 
    criteria.createCriteria("company").add(
      Restrictions.like("company", lookupBean.getCompanyValue() + "%")); 
} 

List<TrailerDetail> tdList = 
     criteria.createCriteria("location").addOrder(Order.asc("location")).list(); 

Antwort

7

Nicht ganz sicher, dass ich folge Ihrem Beispiel, aber es ist durchaus möglich, Filterbedingungen auf einer zugehörige Einheit zu spezifizieren , einfach durch Verschachtelung Kriterien Objekte, um einen Baum zu bilden. Zum Beispiel, wenn ich ein Unternehmen Auftrag mit einer Viele-zu-Eins-Beziehung zu einer Benutzern Entität genannt habe, kann ich alle Aufträge für einen Benutzer namens Fred mit einer Abfrage wie folgt finden:

List<Order> orders = session.createCriteria(Order.class) 
    .createCriteria("user") 
     .add(eq("name", "fred")) 
    .list(); 

Wenn Sie über eine Entität sprechen, die eine Beziehung zu sich selbst hat, sollte das auch funktionieren. Sie können "name" auch durch "id" ersetzen, wenn Sie nach der ID eines zugeordneten Objekts filtern müssen.

+2

+1. Sie sollten jedoch mit IDs vorsichtig sein - abhängig von der Zuordnung ist es möglicherweise nicht notwendig (oder sogar legal), verschachtelte Kriterien zu erstellen, um Assoziationen nach ID abzufragen. Daher würden Sie im obigen Beispiel 'session.createCriteria (Order.class) .add (eq (" user.id ", 25)) verwenden. List()' – ChssPly76

+0

Und ich würde das hinzufügen, wenn Sie eine Referenz haben Zu dem zugehörigen Objekt in Ihrem Java-Code könnten Sie auch das Entity-Objekt selbst als Argument an den Restrictions.eq-Aufruf übergeben (z. B. Restrictions.eq ("user", user)) statt der ID. Mit Session.load (User.class, ) können Sie eine solche Referenz problemlos abrufen, ohne eine Leistungseinbuße zu zahlen. –

+0

Danke, dass dein Vorschlag funktioniert hat. Hatte keinen Verweis auf das zugehörige Objekt. Ich könnte meine Frage bearbeiten, um den Ersatzcode anzugeben, der funktioniert hat. Aber wie würden Sie mehr als ein Kriterium nisten, wenn Sie es brauchen? Ich brauche das nicht, aber das könnte problematisch sein. Wenn Sie nur eins verschachteln müssen, sollte es wahrscheinlich das letzte sein, was Sie an den ursprünglichen Kriterien anheften. Wie auch immer danke! Ich habe gerade Dutzende von Codezeilen, die eine HQL-Abfrage mit einem StringBuffer erstellen, auf ungefähr weniger als 10 Zeilen ersetzt. –