2011-11-30 13 views
10

Quiero transformar mis consultas JPAQL en consultas API de criterios.API de criterios Ruta a la identidad de sub-sub-entidad

Considerar consulta como esta:

SELECT e FROM Entity e WHERE e.parent.id = :parentId 

WHERE parte se transforma en:

Path<Long> parentId = root.get(Entity_.parent).get(ParentEntity_.id); 
Predicate whereParentId = builder.equal(parentId, selectedParent.getId()); 

La pregunta es, cómo crear predicado para el DONDE así:

SELECT e FROM Entity e WHERE e.parent.parent.id = :parentId 

Cómo para crear Path al padre de la identificación padre?

Respuesta

7

Si el JPQL que has demostrado está trabajando, a continuación, voy a suponer que su ParentEntity es la celebración de una referencia a su padre (en una forma de parent campo de la ParentEntity tipo). Por lo tanto, algo como esto debería funcionar:

Path<Long> parentId = root.get(Entity_.parent) 
    .get(ParentEntity_.parent) 
    .get(ParentEntity_.id); 
Predicate whereParentId = builder.equal(
    parentId, selectedParent.getId() 
); 

que he hecho algo similar, pero por una entidad (Customer es infantil y entidad matriz al mismo tiempo, y las referencias a su padre a través parent campo de la Customer tipo) y algo parecido esto funcionó perfectamente bien:

query.select(customer) 
    .where(criteriaBuilder.equal(
     customer.get("parent").get("parent").get("id"), 
     criteriaBuilder.parameter(int.class, "parentId")) 
    ); 

List<Customer> customers = em.createQuery(query) 
    .setParameter("parentId", john.getId()).getResultList(); 
+0

¿Cómo lo harías para un elemento dentro de un mapa? 'ruta Ruta = entity.get (" mapAtribute) ... ' No sé cómo pasar la llave una vez que consigo el mapa para obtener el elemento deseado Aquí está mi pregunta agujero:. Http : //stackoverflow.com/questions/21436972/jpa-2-criteria-for-sorting-based-on-an-atribute-from-a-map-value Gracias! – Gayolomao

1
SELECT e FROM Entity e inner join e.parent p WHERE p.id = :parentId 

en criterios llaman un alias como:

sess.createCriteria(Entity.class) 
    .createAlias("e.parent", "p") 
Cuestiones relacionadas