gpt4 book ai didi

hibernate - JPA 相关子查询中缺少 "from"

转载 作者:行者123 更新时间:2023-12-05 06:40:16 25 4
gpt4 key购买 nike

我正在努力处理 JPA Criteria API 子查询关联。从一个复杂的查询中,我用这个简单的案例复制了我的问题:

@Entity
public class Person {

@Id
Long id;

String name;

@ManyToMany
Set<Person> relatives;

}
CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);

Root<Person> from = criteriaQuery.from(Person.class);

Subquery<Long> subquery = criteriaQuery.subquery(Long.class);

SetJoin<Person, Person> correlate = subquery.correlate(from.joinSet("relatives"));

Subquery<Long> where = subquery.select(criteriaBuilder.count(correlate)).where(criteriaBuilder.equal(correlate.get("name"), "Giovanni"));

criteriaQuery = criteriaQuery.select(criteriaBuilder.count(from)).where(criteriaBuilder.greaterThan(where, 0L));

entityManager.createQuery(criteriaQuery).getSingleResult();

无法生成带有空 from ... 子句的子查询:

select count(generatedAlias0)
from Person as generatedAlias0
inner join generatedAlias0.relatives as generatedAlias1
where (
select count(generatedAlias1)
from
where generatedAlias1.name=:param0
) > 0L

我认为 correlate 会设置正确的 from。我错过了什么?

最佳答案

我会解决这个问题:问题是错误的表达式用作 correlate 参数。关联应该在 originat From 表达式上完成,而不是在目标上;即

CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);

Root<Person> from = criteriaQuery.from(Person.class);

Subquery<Long> subquery = criteriaQuery.subquery(Long.class);

Root<Person> correlate = subquery.correlate(from);
// Instead of SetJoin<Person, Person> correlate = subquery.correlate(from.joinSet("relatives"));

Subquery<Long> where = subquery.select(criteriaBuilder.count(correlate)).where(
criteriaBuilder.equal(correlate.joinSet("relatives").get("name"), "Giovanni")
/* ^^^ instead of correlate.get("name") */
);

criteriaQuery = criteriaQuery.select(criteriaBuilder.count(from)).where(criteriaBuilder.greaterThan(where, 0L));

entityManager.createQuery(criteriaQuery).getSingleResult();

关于hibernate - JPA 相关子查询中缺少 "from",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42984401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com