【问题标题】:JPQL multiple MEMBER OFJPQL 多个成员
【发布时间】:2012-04-12 22:12:50
【问题描述】:

我想知道是否有任何 JPQL 构造可以帮助我解决这个问题:

想象一下 Chat 和 User 的简单 M-N 关系(用户可能出现在多个 chat-s 中)。

public class ChatEntity implements Serializable {

@ManyToMany(targetEntity = UserEntity.class)
@JoinTable(name = "CHATS_USERS",
        joinColumns = @JoinColumn(name = "CHAT_ID"),
        inverseJoinColumns = @JoinColumn(name = "USER_ID"))
private Collection<User> users;

}

让我们想象一下这些数据(C1..CN = 聊天 ID,U1..UN = 用户 ID)

c1 ~ {u1, u2, u3} // in chat1 is user1, user2 and user3
c2 ~ {u1, u3}
c3 ~ {u2, u3}

现在我想选择这样的聊天,它具有完全相同的用户集合,我将传递给查询。例如

{u1, u3} -> c2
{u1, u2, u3} -> c1
{u1, u2} -> NULL (no result)

我发现 MEMBER OF constuct 看起来不错。例如

SELECT c FROM Chat c WHERE (:u1 MEMBER OF c.users) AND (:u2 MEMBER OF c.users)
    ... AND (:uN MEMBER OF c.users)

但是现在有两个问题

  1. 到目前为止这是不正确的,因为 {u1, u3} 将返回 c1c2 而不仅仅是 c2 符合预期

  2. 我得到了用户的集合,但我不知道是否有办法将这样的集合“分解”为 命名查询(查询的静态定义)中的多个 AND 子句,或者是否有是任何可以帮助我解决此问题的 JPQL 构造。例如。像

    ... WHERE :users = c.users

【问题讨论】:

    标签: jpa jpql


    【解决方案1】:

    那么...您希望用户只包括那些用户?

    也许还包括

    AND size(c.users) = 3
    

    或许,

    Select c from Chat c join c.users u where not exists (Select u from User u2 where u = u2 and u.id not in :ids)
    

    【讨论】:

    • 尺寸做到了。其实它不是很好(添加新参数),但它满足:)
    猜你喜欢
    • 2012-07-23
    • 2017-06-20
    • 2016-06-03
    • 2014-12-17
    • 2011-11-09
    • 2013-04-17
    • 2020-05-10
    • 2018-11-01
    • 2013-01-11
    相关资源
    最近更新 更多