我的Hibernate/jpql查询在加入时返回重复的值,我该如何避免

发布于 2025-01-29 02:03:12 字数 2209 浏览 2 评论 0原文

我有jpql查询,将查询的输出映射到特定对象

return em.createQuery(
        "SELECT DISTINCT new org.some.great.project.Statuses(u.accountStatus, COUNT(u.accountStatus)) "
            + "FROM XUser u LEFT JOIN u.products p "
            + "WHERE p.id IN :productIds "
            + "GROUP BY u.accountStatus", Statuses.class)
    .setParameter(PRODUCT_IDS, productIds) 
    .getResultList();

,并且一切都可以,直到Xuser确实与product表的关系确实存在。 如果它具有多个,则count(xx)将添加其他记录。

我在Xuser中的映射看起来像是按照

public class XUser {

    //other

    @ManyToMany
    @JoinTable(
        name = "XUser_product",
        joinColumns = @JoinColumn(
            name = "user_id",
            referencedColumnName = "id"
        ),
        inverseJoinColumns = @JoinColumn(
            name = "product_id",
            referencedColumnName = "id"
        )
    )
    private Set<Product> products;

    //other
}

我检查日志Hibernate(映射JPQL到lasterin sql)正在运行查询:

SELECT DISTINCT t.ACCOUNTSTATUS, COUNT(t.ACCOUNTSTATUS) FROM XUser x, XUSER_PRODUCT xp , PRODUCT p
WHERE x.ID = xp.XUSER_ID
AND xp.PRODUCT_ID = p.ID
AND p.ID IN (some nubers)
GROUP BY t.ACCOUNTSTATUS;

因此,如果我进行了一点修改,而不是返回count> count 有状态,我想返回所有我将获得的一切我获得

ID名称帐户XUSER_IDPRODUCT_IDID IDNM价格
1PeterDead11212测试199
1PeterDead1123123Fruit999
2TomOk29898 Tom Ok 2 98 98Tabasco11
3KateDead387 8787Mars Mars2

您可以看到,我已经显示了peter id = 1两次。而且,如果此查询更改为以前的查询,我会看到

DEAD: 3 // and I need to have here 2
OK  : 1

任何想法,暗示如何处理?

I have jpql query which maps output of query to specific object

return em.createQuery(
        "SELECT DISTINCT new org.some.great.project.Statuses(u.accountStatus, COUNT(u.accountStatus)) "
            + "FROM XUser u LEFT JOIN u.products p "
            + "WHERE p.id IN :productIds "
            + "GROUP BY u.accountStatus", Statuses.class)
    .setParameter(PRODUCT_IDS, productIds) 
    .getResultList();

And everything is ok, until XUser does have only on relation to Product table.
If it has more than one, count(xx) will add additional record.

My mapping in XUser looks like following

public class XUser {

    //other

    @ManyToMany
    @JoinTable(
        name = "XUser_product",
        joinColumns = @JoinColumn(
            name = "user_id",
            referencedColumnName = "id"
        ),
        inverseJoinColumns = @JoinColumn(
            name = "product_id",
            referencedColumnName = "id"
        )
    )
    private Set<Product> products;

    //other
}

If I check logs hibernate (maps jpql to followin sql) is running query:

SELECT DISTINCT t.ACCOUNTSTATUS, COUNT(t.ACCOUNTSTATUS) FROM XUser x, XUSER_PRODUCT xp , PRODUCT p
WHERE x.ID = xp.XUSER_ID
AND xp.PRODUCT_ID = p.ID
AND p.ID IN (some nubers)
GROUP BY t.ACCOUNTSTATUS;

So if I modify it a little, and instead of returning count with status, I want to return everything I am getting

IDNAMEACCOUNTSTATUSXUSER_IDPRODUCT_IDIDNMPRICE
1PeterDEAD11212test199
1PeterDEAD1123123fruit999
2TomOK29898tabasco11
3KateDEAD38787mars2

So as you can see I have displayed Peter with ID=1 two times. And If this query is changed to previous one I would see

DEAD: 3 // and I need to have here 2
OK  : 1

Any ideas, hints how to handle it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文