2012-11-21 11 views
5

mia comprensione di SQL e JPQL non sono quel grande e ho cercato di creare una query JPQL della seguente istruzione SQL:JPQL e iscriviti Tabella

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 Ho dimenticato di aggiungere la ricerca per parte id utente alla query. Vorrei ottenere tutti i gruppi a cui appartiene un utente.

Ma non riesco a ottenere la sintassi corretta. Qualsiasi aiuto sarebbe molto apprezzato.

frammenti pertinenti codice:

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

Cosa stai cercando di fare? –

risposta

8

Uso JPQL sarebbe:

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(); 

dove em è la vostra E ntityManager e user è l'istanza della classe User per cui caricare l'elenco di gruppi. Se avete solo l'ID utente, cambiare con:

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); 

Sarebbe meglio utilizzare un Set o SortedSet (o forse un List se l'utente può essere nello stesso gruppo di più di una volta) al posto di un Collection .