2012-01-26 71 views
10

這是另一個問題,這個時候使用JPA標準API:如何加入許多表

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")); 

某公司的地址,這個地址裏面有市POJO和國家 - POJO。我如何在JOIN中使用它?我試圖與address.city引用它,但我得到的錯誤消息:

從被管理型 [EntityTypeImpl @ 1692700229屬性[address.city]:公司[java類型:類 com.test.domain.Company描述符: RelationalDescriptor(com.test.domain.Company - > [DatabaseTable(COMPANY)]),mappings:16]]不存在。

回答

19

如果您使用規範Metamodel,您將避免這類錯誤。 在您的代碼中,您濫用了「牙醫」關鍵字,這可能是您錯誤的原因,因爲「牙醫」不是公司實體中的字段。

不過,看你如何在其他問題定義類,順便來定義join使用元模型是這樣的:

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

正如你所看到的,元模型避免使用字符串,等等避免了很多運行時錯誤。如果反正你不使用的元模型,試試這個:

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

如果你現在想where後添加predicate,即東西,你會寫是這樣的:

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

如果您要添加一個join對城市實體:

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

(假設該領域的cityName是爲你的城市的正確字段名)。