【问题标题】:Unexpected Cross Join Generated SQL Using EntityManager with hibernate使用 EntityManager 和 hibernate 意外交叉连接生成的 SQL
【发布时间】:2014-11-19 23:47:12
【问题描述】:

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

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 获取用户数?

【问题讨论】:

    标签: sql hibernate jpa entitymanager


    【解决方案1】:

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

    创建并添加与给定实体对应的查询根,形成具有任何现有根的笛卡尔积。 (Java EE 的 Javadoc)

    要获得可预测的结果,请创建一次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
    

    【讨论】:

      猜你喜欢
      • 2013-02-25
      • 2022-01-26
      • 1970-01-01
      • 2012-12-04
      • 2014-10-10
      • 2021-11-08
      • 1970-01-01
      • 2021-08-16
      • 2014-03-21
      相关资源
      最近更新 更多