2012-01-26 11 views
10

Ésta es la pregunta más a esto:Cómo utilizar JPA los criterios del API cuando se unen muchas mesas

How to use JPA Criteria API in JOIN

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 

CriteriaQuery<Company> criteria = criteriaBuilder.createQuery(Company.class); 
Root<Company> companyRoot = criteria.from(Company.class); 
Join<Company,Product> products = companyRoot.join("dentist"); 
Join<Company, City> cityJoin = companyRoot.join("address.city");//Company->Address->City-city 
criteria.where(criteriaBuilder.equal(products.get("category"), "dentist"),      criteriaBuilder.equal(cityJoin.get("city"),"Leeds")); 

Una empresa tiene una dirección, dentro de la dirección no es la ciudad-POJO y Country- Pojo. ¿Cómo puedo usarlo en JOIN? He intentado hacer referencia a ella con address.city pero me dio el mensaje de error:

El atributo [address.city] del tipo administrado [EntityTypeImpl @ 1692700229: Company [javaType: Clase com.test.domain.Company descriptor: RelationalDescriptor (com.test.domain.Company -> [DatabaseTable (COMPANY)]), mappings: 16]] no está presente.

Respuesta

19

Si usa canonical Metamodel, evitará este tipo de errores. En su código ha utilizado mal la palabra clave "dentista", esa es probablemente la causa de su error, porque "dentista" no es un campo en la entidad de la Compañía.

Sin embargo, mirando cómo se definió la clase en la otra pregunta, la forma de definir que join usando metamodelo es la siguiente:

SetJoin<Company,Product> products = companyRoot.join(Company_.products); 

Como se puede ver, Metamodel evita el uso de cadenas, y así evita muchos errores de tiempo de ejecución Si de todos modos no se utiliza Metamodel, intente esto:

SetJoin<Company,Product> products = companyRoot.join("products"); 

Si ahora quiere añadir un predicate, es decir, algo después de la where, que voy a escribir algo como:

Predicate predicate = criteriaBuilder.equal(products.get(Product_.category), "dentist"); 
criteria.where(predicate); 

Si quiere añadir un join para la entidad ciudad:

Join<Company, City> city = companyRoot.join(Company_.city); 
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(city.get(City_.cityName), "Leeds"); 
criteria.where(predicate); 

(suponiendo que el cityName campo es el nombre de campo correcto para su ciudad).

Cuestiones relacionadas