2012-03-29 5 views
1

Ich frage mich, ob es eine JPQL Konstrukt ist, das mir bei diesem Problem helfen könnten:JPQL mehrere MEMBER OF

Stellen Sie sich vor einfachen M-N-Beziehung von Chat und Benutzer (User kann sich in mehreren Chat-s vorhanden sein).

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; 

} 

Lässt diese Daten vorstellen (C1..CN = Chat-IDs, Benutzer-IDs U1..UN =)

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

Jetzt möchte ich solche Chat auszuwählen, die ich genau die gleiche Sammlung von Benutzern hat wird an die Abfrage übergeben. Z.B.

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

Ich fand MEMBER OF constuct, die nett scheint. Z.B.

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

Aber jetzt gibt es zwei Probleme

  1. Dies ist nicht so weit korrigieren, da {u1, u3} kehrt sowohl c1 und c2 und nicht nur c2 Wie erwartet

  2. Ich habe die Sammlung von Benutzern und ich weiß nicht, ob es einen Weg gibt wie man diese Sammlung in mehrere AND-Klauseln zerlegt in benannte Abfrage (statische Definition der Abfrage) oder wenn es irgendein JPQL-Konstrukt gibt, das mir dabei helfen wird. Z.B. so etwas wie

    ... WO: users = c.users

Antwort

0

So ... Sie die Benutzer wollen nur diejenigen Benutzer gehören zu?

Vielleicht auch

AND size(c.users) = 3 

Oder vielleicht,

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

Dank für Antwort, werde ich es ausprobieren – d1x

+0

die Größe es tat. Eigentlich ist es nicht so nett (Hinzufügen neuer Parameter), aber es erfüllt :) – d1x