2012-03-29 82 views
1

多个成员,如果有任何JPQL结构,它可以帮助我解决这个问题:JPQL的

想象聊天和用户的简单的M-N的关系(用户可能存在于多个聊天-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} 

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

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

我发现构件的构件看起来不错。例如。

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:用户= c.users

回答

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) 
+0

谢谢回答,我会检查出来 – d1x 2012-04-04 16:36:52

+0

尺寸做到了。其实它不是很好(添加新的参数),但它满足:) – d1x 2012-10-11 11:06:56