私は、Hibernateを使用して複雑なクエリをまとめようとしています。私はCriteriaに傾いていますが、それは不可能であると思われ始めています。したがって、どんな提案も役立つでしょう。コレクションの値の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と一致します。最後に、値のユニークなインデックス(インスタンス、属性、値)または(インスタンス、localAttributeName、値)を複雑にする - インスタンス内では、任意の属性は複数の値を持つことがあります。
これは私がこれまで持っているものです。
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"));
しかし、これはスローを私がCriteriaでこれを行うことはできないと私は思っていますが、それ以外は学ぶことが大好きです。これを行う最善の方法は何でしょうか?
それは動作します!!! ...ありがとう。 – Gaurav
ちょっと@ジョン、この問題を手伝ってくれますか?リンクはhttp://stackoverflow.com/questions/22919886/hibernate-criteria-filtering-by-attributes-of-collectionです。ありがとう!何かについてはかなり似ています! – Victor
この回答はHibernateのどのバージョンに適していますか? –