如何在联接多个表时使用 JPA 条件 API

2022-09-04 06:57:58

这是进一步的问题:

如何在 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"));

一家公司有一个地址,地址里面有City-pojo和Country-Pojo。我该如何使用它?我试图引用它,但我收到错误消息:JOINaddress.city

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


答案 1

如果您使用规范元模型,则可以避免此类错误。在您的代码中,您误用了“dentist”关键字,这可能是您错误的原因,因为“dentist”不是公司实体中的字段。

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

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

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

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

如果你现在想添加一个 ,即 在 之后添加一些东西,你会写一些类似的东西:predicatewhere

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

如果要为“城市”实体添加 一个:join

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

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


答案 2

同意@perissf。

我无法评论,但符号“Company_”是元数据类文件,其中包含模型类的所有属性名称。

我强烈建议使用元数据类,您可以使用maven处理器插件自动生成元数据类,使用org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor作为配置中的处理器。

这个例子pom插件xml应该解决它:

  <plugin>
                <groupId>org.bsc.maven</groupId>
                <artifactId>maven-processor-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <phase>generate-sources</phase>
                        <configuration>
                            <processors>
                                <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
                            </processors>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.hibernate.orm</groupId>
                        <artifactId>hibernate-jpamodelgen</artifactId>
                        <version>${version.hibernate-jpamodelgen}</version>
                    </dependency>
                </dependencies>
            </plugin>

推荐