2012-11-21 8 views
5

Mein Verständnis von SQL und JPQL sind nicht so groß, und ich habe versucht worden, eine JPQL Abfrage der folgenden SQL-Anweisung zu erstellen:JPQL und Join-Tabelle

select group.* from user, user_group, group 
where user_group.user_id = user.id 
and user_group.group_id = group.id 
and user.id = [userID to search] 

edit: Woops ich die Suche hinzufügen vergessen haben, durch Benutzer-ID Teil der Abfrage. Ich möchte alle Gruppen erhalten, denen ein Benutzer gehört.

Aber ich kann einfach nicht die Syntax richtig bekommen. Jede Hilfe würde sehr geschätzt werden.

Relevante Code-Schnipsel:

Group.java

@Table(name = "group") 
@Entity 
public class Group implements Serializable { 

@Id 
@GeneratedValue 
@Column(name = "id") 
private Integer id; 

@JoinTable(name = "user_group", joinColumns = { 
    @JoinColumn(name = "group_id", referencedColumnName = "id")}, inverseJoinColumns = { 
    @JoinColumn(name = "user_id", referencedColumnName = "id")}) 
@ManyToMany 
private Collection<User> userCollection; 

} 

User.java

@Table(name = "user") 
@Entity 
public class User implements Serializable { 

@Id 
@NotNull 
@GeneratedValue 
@Column(name = "id") 
private Integer id; 

@Column(name = "email", unique=true, nullable=false) 
private String email; 

@ManyToMany(mappedBy = "userCollection") 
private Collection<Group> GroupCollection; 
} 
+0

Was möchten Sie tun? –

Antwort

8

Mit JPQL es wäre:

TypedQuery<Group> query = em.createQuery(
    "SELECT DISTINCT g FROM User u LEFT JOIN u.groupCollection g " + 
    "WHERE u = :user", Group.class); 
query.setParameter("user", user); 
List<Group> = query.getResultsList(); 

wo em Ihre E ntityManager und user ist die Instanz der Benutzerklasse, für die die Gruppenliste geladen werden soll. Wenn Sie nur die Benutzer-ID haben, ändern Sie mit:

TypedQuery<Group> query = em.createQuery(
    "SELECT DISTINCT g FROM User u LEFT JOIN u.groupCollection g " + 
    "WHERE u.id = :user", Group.class); 
query.setParameter("user", userId); 

Es wäre besser, verwenden ein Set oder SortedSet (oder vielleicht ein List, wenn der Benutzer in der gleichen Gruppe mehr sein kann als einmal) anstelle eines Collection .