我想知道是否有任何JPQL结构可以帮助我解决这个问题:
想象聊天和用户的简单M-N关系(用户可能出现在多个聊天中)。
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}
现在我想选择这样的聊天,它具有完全相同的用户集合,我将传递给查询。 E.g。
{u1, u3} -> c2
{u1, u2, u3} -> c1
{u1, u2} -> NULL (no result)
我发现构造成员似乎很好。 E.g。
SELECT c FROM Chat c WHERE (:u1 MEMBER OF c.users) AND (:u2 MEMBER OF c.users)
... AND (:uN MEMBER OF c.users)
但现在有两个问题
到目前为止这是不正确的,因为 {u1,u3} 将返回 c1 和 c2 ,而不仅仅是 c2 符合预期
我收到了用户的集合,我不知道是否有办法如何将这种集合“分解”为命名查询中的多个AND子句(查询的静态定义)或者是否有任何JPQL结构可以帮助我解决这个问题。例如。
之类的东西... WHERE:users = c.users
答案 0 :(得分:0)
所以......你希望用户只包括那些用户吗?
也许还包括
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)