Hibernate を使用して複雑なクエリをまとめようとしています。私は基準に傾いてきましたが、それは不可能だと思い始めているので、何か提案があれば助かります.
次のようなエンティティ構造があります。
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;
}
これらのエンティティは、予想どおりに関連しています。
value.attribute_id --> attribute.id
value.instance_id --> instance.id
ここで、属性/値のペア (文字列) のセットを取得し、それらすべてを含むすべてのインスタンスを検索できるようにしたいと考えています。Value では、attribute と localAttributeName の 1 つだけが非 null であるため、属性名は localAttributeName または attribute.name のいずれかと一致する可能性があります。さらに複雑なことに、Value の一意のインデックスは on (instance, attribute, value) または (instance, localAttributeName, value) です。つまり、インスタンス内では、任意の属性が複数の値を持つ場合があります。
これは私がこれまでに持っているものです:
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();
}
私が行った調査に基づいて、その「何かをする」セクションで試したことは次のとおりです。
// 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"));
しかし、これは以下の例外をスローします。これは、基準ではこれを行うことができないと言っていると思われますが、それ以外の方法で学びたいと思います:
java.lang.NullPointerException
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:341)
これを行うための最良の方法は何ですか?