gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:04 24 4
gpt4 key购买 nike

这是对此的进一步问题:

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

一个公司有一个地址,地址里面有City-pojo和Country-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 ,您将避免此类错误。在您的代码中,您误用了“牙医”关键字,这可能是您出错的原因,因为“牙医”不是公司实体中的字段。

但是,看看您如何在另一个问题中定义您的类,使用元模型定义 join 的方法是这样的:

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

如您所见,元模型避免使用字符串,因此避免了很多运行时错误。如果无论如何你不使用元模型,试试这个:

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

如果你现在想添加一个predicate,即在where之后的东西,你可以这样写:

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

如果要为 City 实体添加 join:

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

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

关于java - 连接多个表时如何使用 JPA Criteria API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9025196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com