java - 通过 JPA 2.0 CriteriaBuilder 连接两个 JPA 实体时别名无效

标签 java hibernate jpa

我有两个 JPA 实体

class A{
    @OneToMany
    Lis<B> entitiesB;
    @Column("STATUS")
    String status;// will sort based on this column
}

class B{
    @ManyToOne
    A entityA;
    @Column("PROPERTY_ONE")
    String propertyOne;
    ....
    @Column("PROPERTY_M")
    String propertyM;
    ....
}

我需要将 A 与 B 左连接,然后对 B 中的列执行过滤。我有以下条件:

Join<A, B>root=criteriaBuilder
.createQuery(A.class)
.from(A.class)
.join("entitiesB");

CriteriaQuery<A> query = criteriaBuilder.createQuery(A.class);

query.select(query.from(A.class).join("entitiesB"))
        .distinct(true)
        .where(formWhereClause(filters))
        .orderBy(formOrderByClause());

如何通过 A 实体的 status 属性形成过滤器

criteriaBuilder.notEqual(root.get("A").get("status"), "SOME_STATUS_VALUE");

它生成了以下 SQL:

select distinct generatedAlias0 from A as generatedAlias1 
inner join generatedAlias1.entitiesB as generatedAlias0 
where ( generatedAlias2.A.status<>:param0 ) and ( generatedAlias2.propertyOne like :param1 ) 
order by generatedAlias2.propertyM desc

我遇到以下异常:

    'org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: 
Invalid path  generatedAlias2.A.status '

我该如何解决这个问题?我使用 Hibernate 4.3.5 作为持久性提供程序。

最佳答案

CriteriaQuery query = criteriaBuilder.createQuery(A.class);

表示您想要返回A类型的实例。因此,您的 select 子句必须指定查询根,而不是像您那样指定 Join 实例:

  1. 定义查询的根,因为 join 方法只能应用于 RootJoin 类型的实例:

    Root<A> root = query.from(A.class);
    
  2. 定义连接(我需要将 A 与 B 左连接):

    Join<A, B> b = root.join("entitiesB", JoinType.LEFT);
    
  3. 定义SELECT子句:

    query.select(root)
    .distinct(true)
    .where(formWhereClause(filters))
    .orderBy(formOrderByClause());
    
  4. How do I form the filter by the status property from A entity

形成如下:

criteriaBuilder.notEqual(root.get("status"), "SOME_STATUS_VALUE");

如果您想使用 B 的属性作为过滤器,请将其定义为:

criteriaBuilder.equal(b.get("propertyOne"), "SOME_VALUE");

关于java - 通过 JPA 2.0 CriteriaBuilder 连接两个 JPA 实体时别名无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39213495/

相关文章:

java - 如何获取过去一周所有天的日期?

java - Hibernate:不区分大小写的搜索不适用于特殊字符

java - 具有集合的 Hibernate 或 SQL 查询 M-N 成员?

spring - 对象引用未保存的 transient 实例 - Spring、JPA Hibernate

java - JPA hashCode()/equals() 困境

java - 没有 Spring 的 Atomikos 事务管理器

java - 结合工厂方法和单例设计模式

java - UTF-8 编码使用 Tomcat 提交的 servlet 表单

java - 如何从 Android 插件调用 unity C# 函数?

java - native 存储过程与 Hibernate