连接许多表时如何使用JPA Criteria API
问题内容:
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"));
公司有一个地址,地址内有City-pojo和Country-
Pojo。如何在其中使用它JOIN
?我尝试引用它,address.city
但出现了错误消息:
来自托管类型[EntityTypeImpl @ 1692700229:Company
[javaType:类com.test.domain.Company描述符:RelationalDescriptor(com.test.domain.Company->
[DatabaseTable(COMPANY)]))的属性[address.city]映射:16]]不存在。
问题答案:
如果使用规范的Metamodel,将避免此类错误。在您的代码中,您滥用了“
dentist”关键字,这可能是导致错误的原因,因为“ dentist”不是Company实体中的字段。
但是,看看在另一个问题中如何定义类,join
使用Metamodel 定义的方法是:
SetJoin<Company,Product> products = companyRoot.join(Company_.products);
如您所见,Metamodel避免使用字符串,因此避免了很多运行时错误。如果仍然不使用元模型,请尝试以下操作:
SetJoin<Company,Product> products = companyRoot.join("products");
如果现在要添加predicate
,即在后面添加内容,则应where
编写类似以下内容的内容:
Predicate predicate = criteriaBuilder.equal(products.get(Product_.category), "dentist");
criteria.where(predicate);
如果要join
为City实体添加一个:
Join<Company, City> city = companyRoot.join(Company_.city);
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(city.get(City_.cityName), "Leeds");
criteria.where(predicate);
(假设cityName字段是您所在城市的正确字段名称)。