Sto provando a mettere insieme una query complicata usando Hibernate. Mi sono appoggiato alla Criteria, ma sto iniziando a sospettare che non sia possibile, e quindi qualsiasi suggerimento sarebbe utile.Criteri di ibernazione sui valori di raccolta
devo una struttura entità come la seguente:
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;
}
Queste entità sono correlate come ci si aspetterebbe:
value.attribute_id --> attribute.id
value.instance_id --> instance.id
Ora, mi piacerebbe essere in grado di prendere una serie di coppie attributo/valore (stringhe) e trova tutte le istanze che contengono tutte di esse. In Value, solo uno degli attributi e localAttributeName non sono nulli, quindi il nome dell'attributo potrebbe corrispondere a localAttributeName o attribute.name. E per complicare le cose un'ultima volta, l'indice univoco su Valore è attivo (istanza, attributo, valore) o (istanza, localAttributeName, valore) - cioè, all'interno di un'Istanza, qualsiasi Attributo dato può avere più Valori.
Questo è quello che ho finora:
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();
}
Sulla base della ricerca che ho fatto, che cosa ho provato per quella sezione Fare qualcosa è:
// 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"));
Ma questo getta l'eccezione qui sotto, che sospetto mi sta dicendo che non posso farlo con Criteria, ma mi piacerebbe imparare diversamente:
java.lang.NullPointerException
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:341)
Quale sarebbe il modo migliore per farlo?
Funziona !!! .. Grazie. – Gaurav
Ehi, @Jon, potresti aiutarmi con questo problema? Ecco il link http://stackoverflow.com/questions/22919886/hibernate-criteria-filtering-by-attributes-of-collection! Grazie! Riguarda qualcosa di molto simile! – Victor
Quale versione di Hibernate è adatta a questa risposta? –