9

SQL と JPQL についての私の理解はそれほど大きくなく、次の SQL ステートメントの JPQL クエリを作成しようとしています。

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]

編集: おっと、ユーザー ID による検索部分をクエリに追加するのを忘れていました。ユーザーが所属するすべてのグループを取得したいと考えています。

しかし、私は構文を正しくすることができません。どんな助けでも大歓迎です。

関連するコード スニペット:

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;

}

ユーザー.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;
}
4

1 に答える 1

12

JPQLを使用すると、次のようになります。

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

ここで、emはEntityManagerであり、userはグループリストをロードするUserクラスのインスタンスです。ユーザーIDしかない場合は、次のように変更します。

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

Setの代わりに、またはSortedSet(またはList、ユーザーが同じグループに複数回参加できる場合はa)を使用することをお勧めしCollectionます。

于 2012-11-21T03:27:14.670 に答える