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

Schreibe einen Kommentar