8

Quiero convertir el siguiente subconsulta para utilizar hibernación subconsulta:Criterios subconsulta con no nula

getCurrentSession().createQuery("from Employee where id in (select adminId from Department where adminId is not null)") 
        .list(); 
  • Empleado:

    @ManyToOne 
    @JoinColumn(name = "fk_department_id", nullable = true) 
    private Department department; 
    
  • Departamento:

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "fk_department_id") 
    private Set<Employee> employees = new HashSet<Employee>(0); 
    

¿Alguien puede darme un ejemplo de esta conversión, porque leí algunos ejemplos y todavía no puedo encontrar la manera de hacerlo.

+0

BTW, tengo un problema grave recientemente al ajustar cualquier bloque de código cuando publico una nueva pregunta, hago como siempre copio el código de mi IDE o del archivo de texto y destaco el código y lo rodeo con el botón de código, pero se muestra mal. –

+0

Eso es porque estás usando pestañas en lugar de espacios. –

+0

¿me puede decir cómo fue posible volver a formatear el código, por lo que puedo evitarlo en el futuro? –

Respuesta

19
Criteria c = session.createCriteria(Employee.class, "e"); 
DetachedCriteria dc = DetachedCriteria.forClass(Departemt.class, "d"); 
dc.add(Restrictions.isNotNull("d.adminId"); 
dc.setProjection(Projections.property("d.adminId")); 
c.add(Subqueries.propertyIn("e.id", dc)); 

La llamada setProjection hace que la subconsulta devuelve la propiedad adminId sólo que en lugar de toda la entidad Department. El Subqueries.propertyIn crea una restricción: la propiedad id del empleado buscado debe ser in el conjunto de resultados devueltos por la subconsulta.

+0

funciona bien, gracias, pero ¿pueden darme una explicación de las dos últimas líneas, no pude encontrar el documento? para ellos. –

+0

Hecho. Ver mis ediciones –