这是另一个问题:
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是您城市的正确字段名称).