Hibernate Kriterien für die Sammlung der Werte
Ich versuche, die zusammen eine komplizierte Abfrage mit Hibernate. Ich habe schon der Neigung zu Kriterien, aber ich fange an zu vermuten, es ist nicht möglich, und so Anregungen wäre hilfreich.
Habe ich ein entity-Struktur wie die folgende:
public class Attribute {
private Integer id;
private String name;
private Set<Value> values;
}
public class Instance {
private Integer id;
private int instanceRef;
private Set<Value> values;
}
public class Value {
private Integer id;
private Attribute attribute;
private String localAttributeName;
private Instance instance;
private String value;
}
Diese Entitäten verknüpft sind, als man erwarten würde:
value.attribute_id --> attribute.id
value.instance_id --> instance.id
Nun, ich möchte in der Lage sein, eine Reihe von Attribut/Wert-Paaren (Strings) und suchen Sie alle Instanzen enthalten alle von Ihnen. Im Wert, die nur ein Attribut und localAttributeName sind nicht null, also das Attribut name kann entsprechend localAttributeName oder Attribut.name. Und um die Dinge zu komplizieren ein letztes mal, der eindeutige index auf Wert (Beispiel, Attribut, Wert) oder (Instanz, localAttributeName, Wert) - das heißt, innerhalb einer Instanz ein Attribut kann mehrere Werte haben.
Dies ist, was ich habe, so weit:
public List<Instance> getMatchingInstances(Map<String, String> attrValues) {
Criteria crit = session.createCriteria(Instance.class, "i");
for(Map.Entry<String, String> entry : attrValues) {
DetachedCriteria valueCrit = DetachedCriteria.forClass(Value.class, "v");
//Do something here with valueCrit
crit.add(Subqueries.exists(valueCrit));
}
return crit.list();
}
Basierend auf der Forschung, die ich getan habe, was ich versucht habe, für die, die etwas Tun Abschnitt:
//This would only check localAttributeName and not attribute.name.
//That's okay -- once I get the rest to work, I can figure this out.
valueCrit.add(Restrictions.eq("localAttributeName", entry.getKey());
valueCrit.add(Restrictions.eq("value", entry.getValue());
valueCrit.add(Restrictions.eqProperty("v.instance_id", "i.id"));
Aber dies wirft die Ausnahme unten, was ich vermute, ist, sagen mir, ich kann es nicht mit Kriterien, aber ich würde lieben zu lernen, ansonsten:
java.lang.NullPointerException
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:341)
Was wäre der beste Weg zu gehen über das tun dies?
InformationsquelleAutor Jon | 2011-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dachte ich, die Lösung nach ein paar Stunden zu hämmern. Hoffentlich ist das der Einsatz für andere. Es waren drei wichtigsten Punkte, die ich brauchte, um zu lösen, machen dies möglich:
Habe ich hervorgehoben, jedes von diesen in dem code unten.
Erste, um loszuwerden, die Ausnahme habe ich entdeckt, dass die Unterabfrage benötigt eine Projektion, unten hervorgehoben. Ich habe nur eine Projektion auf die "id" - Eigenschaft der Instanz.
Zweiten, um die join, habe ich die Kriterien.createCriteria () - Methoden zu erstellen, die eine left outer join. Denn ich hatte mehrere Bedingungen auf den verschiedenen Ebenen der Verknüpfung, ich hatte zum speichern der verknüpften Kriterien und befestigen Sie Ausdrücke, die Sie separat. Diese lassen Sie mich mein ODER ein Ausdruck in der Unterabfrage.
Endlich, ich musste hinzufügen eine eqProperty () - Klausel zum anzeigen der Unterabfrage zurück zu den wichtigsten Kriterien. Nur wie würde es brauchen, um in der resultierenden SQL-verwendet habe ich: - Instanz.id = ich.id. Da hatte ich bereits zugeordnet, die Instanz, die Kriterien zu "ich" und das hinzufügen Sie diese Klausel, um die Value-Kriterien, dieser übersetzt die SQL: v. instance_id = ich.id.
Hier ist der funktionierende code:
Hey @Jon, könnten Sie mir helfen mit diesem problem? Hier ist der link stackoverflow.com/questions/22919886/...! Danke! Ist etwa etwas ziemlich ähnliches!
Welche version von Hibernate ist diese Antwort gut?
InformationsquelleAutor Jon