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

Sam*_*ami 11 java jpa join criteria-api

这是对此的进一步问题:

如何在JOIN中使用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"));
Run Code Online (Sandbox Code Playgroud)

公司有地址,地址内有City-pojo和Country-Pojo.我该如何使用它JOIN?我尝试引用它,address.city但我收到了错误消息:

来自托管类型[EntityTypeImpl @ 1692700229:Company [javaType:class com.test.domain.Company descriptor:RelationalDescriptor(com.test.domain.Company - > [DatabaseTable(COMPANY)])的属性[address.city],映射:16]]不存在.

per*_*ssf 24

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

但是,看看你在另一个问题中如何定义你的类,join使用Metamodel 定义它的方法是这样的:

SetJoin<Company,Product> products = companyRoot.join(Company_.products); 
Run Code Online (Sandbox Code Playgroud)

如您所见,Metamodel避免使用字符串,因此避免了大量的运行时错误.如果你不使用Metamodel,试试这个:

SetJoin<Company,Product> products = companyRoot.join("products"); 
Run Code Online (Sandbox Code Playgroud)

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

Predicate predicate = criteriaBuilder.equal(products.get(Product_.category), "dentist");
criteria.where(predicate);
Run Code Online (Sandbox Code Playgroud)

如果要join为City实体添加a :

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

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

  • 带有尾随下划线的符号“Company_”从何而来?当我尝试这些时,我得到“无法解析符号‘公司_’ (6认同)