java – 在连接多个表时如何使用JPA Criteria API

前端之家收集整理的这篇文章主要介绍了java – 在连接多个表时如何使用JPA Criteria 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引用它,但是我收到了错误信息:

The attribute [address.city] from the managed type
[EntityTypeImpl@1692700229:Company [ javaType: class
com.test.domain.Company descriptor:
RelationalDescriptor(com.test.domain.Company –>
[DatabaseTable(COMPANY)]),mappings: 16]] is not present.

解决方法

如果您使用规范的 Metamodel,您将避免这种错误.
在您的代码中,您误用了“牙医”关键字,这可能是您错误的原因,因为“牙医”不是公司实体中的一个字段.

然而,看看你如何在另一个问题中定义你的类,使用Metamodel来定义这个连接的方法是这样的:

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

如您所见,Metamodel避免使用字符串,因此避免了大量的运行时错误.如果无论如何,不​​要使用元模型,请尝试:

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

如果你现在想添加一个谓词,即在某个地方之后,你会写下如下:

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

如果要为City实体添加联接:

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

(假设cityName是您城市的正确字段名称).

原文链接:/java/125404.html

猜你在找的Java相关文章