我有两个 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
实例:
定义查询的根,因为
join
方法只能应用于Root
或Join
类型的实例:Root<A> root = query.from(A.class);
定义连接(
我需要将 A 与 B 左连接
):Join<A, B> b = root.join("entitiesB", JoinType.LEFT);
定义
SELECT
子句:query.select(root) .distinct(true) .where(formWhereClause(filters)) .orderBy(formOrderByClause());
-
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/