2012-01-26 10 views
10

Questa è l'ulteriore domanda a questo:Come utilizzare JPA Criteri API quando si uniscono molte tabelle

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 società ha un indirizzo, all'interno l'indirizzo si trova la città-POJO e Paese- POJO. Come posso usarlo in JOIN? Ho cercato di farvi riferimento con address.city ma ho ottenuto il messaggio di errore:

L'attributo [address.city] dal tipo gestito [EntityTypeImpl @ 1.692.700,229 mila: Company [javaType: class com.test.domain.Company descrittore: RelationalDescriptor (com.test.domain.Company -> [DatabaseTable (COMPANY)]), mapping: 16]] non è presente.

risposta

19

Se si utilizza canonico Metamodel, si eviterà questo tipo di errori. Nel tuo codice hai abusato della parola chiave "dentista", questa è probabilmente la causa del tuo errore, perché "dentista" non è un campo nell'entità aziendale.

Tuttavia, guardando a come è stata definita la classe in altra domanda, il modo di definire che join usando Metamodel è questo:

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

Come si può vedere, Metamodel evita l'uso di corde, e così evita molti errori di runtime. Se in ogni caso non si utilizza Metamodel, provate questo:

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

Se ora si vuole aggiungere un predicate, vale a dire qualcosa dopo la where, bisogna scrivere qualcosa del tipo:

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

Se desidera aggiungere un join per l'entità città:

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

(supponendo che il nome della città di campo è il nome del campo corretto per la città).

Problemi correlati