2012-09-05 15 views
6

Estoy tratando de reducir el conjunto de resultados de la consulta de Hibernate Criteria por el resultado de otra consulta. Sé cómo resolver este problema con JPQL:Estrechando el resultado de la consulta por subconsulta

FROM DocPackage p WHERE 
    EXISTS (SELECT g 
    FROM ObjectGroup g JOIN g.items i, Person per 
    WHERE g=p.applicantGroup 
     AND i.objectClass = 'org.cp.model.common.Person' 
     AND i.objectId=per.id 
     AND lower(concat(per.firstName,' ',per.lastName)) like :applicant 
) 

Pero no me puedo imaginar cómo hacer esa consulta con Criteria. ¿Alguna idea de cómo implementar esta selección con Criteria? Hibernate 3.3 es usado.

UPD: Tratar de resolver este problema que he hecho la siguiente consulta Criterios:

Criteria resultCriteriaQuery = this.hibernateSession.createCriteria(DocPackage.class, "pack"); 
     DetachedCriteria personSubquery = DetachedCriteria.forClass(Person.class, "pers"). 
      add(Restrictions.like("pers.loFstLstName", "%" + searchObject.getApplicant().toLowerCase() + "%")). 
      add(Restrictions.eqProperty("itm.objectId", "pers.id")); 
     DetachedCriteria applicantsSubquery = DetachedCriteria.forClass(ObjectGroup.class, "objGrp"). 
      add(Restrictions.eqProperty("pack.applcantGroup", "objGrp")). 
      createAlias("objGrp.items", "itm"). 
      add(Restrictions.eq("itm.objectClass", "org.cp.model.common.Person")). 
      add(Subqueries.exists(personSubquery)); 
     resultCriteriaQuery.add(Subqueries.exists(applicantsSubquery)); 

Pero no funciona. Tengo un NullPointerException en resultCriteriaQuery.list(). ¿Qué pasa con esta consulta? ¿Algunas ideas?

Respuesta

0

para analizar el caso un poco mejor, imprime la declaración HQL generada automáticamente a partir de los criterios, se tiene que poner en las propiedades de conexión de hibernación:

<property name="hibernate.show_sql" value="true" /> 
<property name="hibernate.format_sql" value="true" /> 

Y el registro de depuración.

Una vez que lo tenga, puede compararlo con el que desea generar y ver las diferencias.

Saludos,

0

Puede crear subcriterios con el método Criteria.createCriteria(String).

Suponiendo que el siguiente escenario:

Clase B tiene un nombre: Cadena.

Clase A tiene elementos: Conjunto.

Ahora desea (aparte de otras restricciones) sólo A-objetos cuando haya una B con name = "X":

Criteria crit = session.createCriteria(A.class); 
<add your restrictions for A> 

Criteria narrow = crit.createCriteria("elements"); 
narrow.add(Restrictions.eq("name", "X"); 

// This will respect the constraints applied to narrow 
crit.list(); 
0

no combinaciones asociadas no son compatibles con los criterios del API de Hibernate. Esta fila es un problema:

FROM ObjectGroup g JOIN g.items i, Person per 

Por lo que veo, que necesita para crear una asignación explícita entre ObjectGroupItem y Persona. Esto se puede lograr por medio de la anotación de Hibernate @ Any. Eche un vistazo a Hibernate Annotations, párrafo 2.4.5.2. Cuando se asigne la asociación, use los criterios # createCriteria() o Criteria # createAlias ​​() para agregar las uniones necesarias a la consulta secundaria. Ya está utilizando la API correcta para agregar una subconsulta a la consulta principal.

Cuestiones relacionadas