gpt4 book ai didi

sql - 使用 EntityManager 和 hibernate 意外交叉连接生成的 SQL

转载 作者:行者123 更新时间:2023-12-01 09:56:21 25 4
gpt4 key购买 nike

我正在尝试获取特定组中的用户数,我已经完成了以下操作:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> q = cb.createQuery(Long.class);
q.select(cb.count(q.from(User.class))).where(cb.equal(q.from(User.class).get("userGroup"), groupId));

但是我没有得到组中的用户数量,而是得到这个数字乘以我表中所有用户的数量,生成的 ORM 请求如下所示:

Hibernate: select count(*) as col_0_0_ from app_user user0_ cross join app_user user1_ where user1_.user_group=1

编辑:

这是我的用户模型:

public class User {
private String userFirstName;
private String userLastName;
/* some stuff */
@ManyToOne
private Group userGroup;
}

我的组模型有一个用 @Id 注释并命名为 id 的 int 属性。在这种情况下,如何按组 id 获取用户数?

最佳答案

这是预期的行为。 CriteriaQuery 是可变的,每次调用 from() 时,它

Create and add a query root corresponding to the given entity, forming a cartesian product with any existing roots. (Javadoc of Java EE)

要获得可预测的结果,请创建一次 Root 并使用引用。

CriteriaQuery<Long> q = cb.createQuery(Long.class);
Root<User> u = q.from(User.class);
q.select(cb.count(u)).where(cb.equal(u.get("userGroup"), groupId));

在上面的代码中,u的作用和这个查询中的一样

SELECT u.name FROM User u

进一步解释,调用 from() 两次相当于

SELECT u1, u2 FROM User u1, User u2

关于sql - 使用 EntityManager 和 hibernate 意外交叉连接生成的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26034593/

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