Estoy tratando de armar una consulta complicada usando Hibernate. Me he estado inclinando por Criteria, pero estoy empezando a sospechar que no es posible, por lo que cualquier sugerencia sería útil.Criterios de Hibernación en los valores de recopilación
que tienen una estructura de entidad como el siguiente:
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;
}
Estas entidades están relacionadas como era de esperar:
value.attribute_id --> attribute.id
value.instance_id --> instance.id
Ahora, me gustaría ser capaz de tomar un conjunto de pares de atributo/valor (cadenas) y encontrar todas las instancias que contienen todas de ellas. En Value, solo uno de los atributos y localAttributeName no son nulos, por lo que el nombre del atributo puede coincidir con localAttributeName o attribute.name. Y para complicar las cosas una vez más, el índice único en Value está activado (instancia, atributo, valor) o (instancia, localAttributeName, value); es decir, dentro de una Instancia, cualquier Atributo dado puede tener múltiples Valores.
Esto es lo que tengo hasta ahora:
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();
}
Sobre la base de la investigación que he hecho, lo que he tratado de esa sección de hacer algo es:
// 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"));
Pero esto arroja la excepción a continuación, que sospecho que me está diciendo que no puedo hacer esto con Criteria, pero me gustaría saber lo contrario:
java.lang.NullPointerException
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:341)
¿Cuál sería la mejor manera de hacerlo?
Funciona !!! .. Gracias. – Gaurav
Hola @Jon, ¿podrías ayudarme con este problema? Aquí está el enlace http://stackoverflow.com/questions/22919886/hibernate-criteria-filtering-by-attributes-of-collection! ¡Gracias! Es sobre algo bastante similar! – Victor
¿Para qué versión de Hibernate es buena esta respuesta? –