मैं एक साथ एक जटिल क्वेरी हाइबरनेट का उपयोग कर डाल करने के लिए कोशिश कर रहा हूँ। मैं मानदंड की ओर झुका रहा हूं, लेकिन मुझे संदेह है कि यह संभव नहीं है, और इसलिए कोई सुझाव उपयोगी होगा।हाइबरनेट मापदंड को महत्व देता
मैं की तरह एक इकाई संरचना है निम्नलिखित:
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
अब, मैं का एक सेट लेने में सक्षम होना चाहते हैं विशेषता/मूल्य जोड़े (स्ट्रिंग्स) और उन सभी उदाहरणों को ढूंढें जिनमें सभी शामिल हैं। मान में, केवल एक विशेषता और localAttributeName गैर-शून्य हैं, इसलिए विशेषता का नाम स्थानीयAttributeName या 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"));
लेकिन इस फेंकता
यह वही है मैं अब तक किया है नीचे दिया गया अपवाद, जो मुझे संदेह है, मुझे बता रहा है कि मैं इसे मानदंड के साथ नहीं कर सकता, लेकिन मुझे अन्यथा सीखना अच्छा लगेगा:
java.lang.NullPointerException
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:341)
ऐसा करने के लिए जाने का सबसे अच्छा तरीका क्या होगा?
यह काम करता है !!! .. धन्यवाद। – Gaurav
हे @ जोन, क्या आप इस समस्या से मेरी मदद कर सकते हैं? यहां लिंक है http://stackoverflow.com/questions/22919886/hibernate-criteria-filtering-by-attributes-of-collection! धन्यवाद! कुछ इसी तरह के बारे में है! – Victor
हाइबरनेट का कौन सा संस्करण इस उत्तर के लिए अच्छा है? –