2016-12-11 3 views
0

にマッピングされていない私は4つのエンティティと1つの表を結合しており、私はこのようなクエリを作りたい:は表クエリに参加します。表は

コラボレーター:

@Entity 
public class Collaborator implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

@ManyToOne(cascade = {CascadeType.MERGE, 
         CascadeType.DETACH, 
         CascadeType.REFRESH }, 
      fetch = FetchType.EAGER) 
@JoinColumn(name = "UserID", nullable = true) 
private User user; 

@ManyToOne(cascade = {CascadeType.MERGE, 
         CascadeType.DETACH, 
         CascadeType.REFRESH }, 
      fetch = FetchType.EAGER) 
@JoinColumn(name = "TaskID", nullable = true) 
private Task task; 

...} 

ユーザー:

@Entity 
public class User implements Serializable { 


@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

@ManyToMany(cascade = {CascadeType.MERGE, 
      CascadeType.DETACH, 
      CascadeType.REFRESH }, 
fetch = FetchType.EAGER) 
@JoinTable( 
    name = "users_roles", 
    joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), 
    inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")) 
private Set<Role> roles = new HashSet<>(); 

OneToMany(mappedBy="user", fetch = FetchType.EAGER) 
private Set<Collaborator> collaborators = new HashSet<>(); 
...} 

役割:

@Entity 
public class Role implements Serializable{ 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long id; 

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

@JsonIgnore 
@ManyToMany(mappedBy = "roles",fetch = FetchType.EAGER) 
private Set<User> users; 
... } 

タスク:

@Entity 
public class Task implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

@OneToMany(mappedBy = "task", fetch = FetchType.EAGER) 
private Set<Collaborator> collaborators = new HashSet<>(); 
...} 

私の問題:

が、私は役割によってタスクを取得したいと私はこのクエリを試みた:

@Query("select t from Task as t, Collaborator as c, Role as r, User as u, users_roles as ur " 
     + "where c.user = u.id " 
     + "and u.id = ur.user_id " 
     + "and r.id = ur.role_id " 
     + "and r.name = :role " 
     + "and c.task = t.id " 
     + "and t.done = :done ") 
List<Task> getTasksByRoleAndState(@Param("role")String role, @Param("done") boolean done); 

を私が得ましたエラー:

users_roles is not mapped 

任意の提案は大歓迎です、ありがとう

+0

メッセージに「users_roles」という名前のENTITYはありません。そして? JPQLでは、RELATIONSにJOINを使用します。あなたはクラスを投稿しないので、誰がどのようなJOINを作るべきかを提案することができますか? JPQL!= SQL –

+0

私のクラスはこれに必要ではなく、4つのエンティティと1つのジョイント可能なものがあると言いました(私はmanytomany関係を持っています)。 –

+0

私の1つの問題は多分質問です:どのようにJPQL –

答えて

1

JPQLは、これだけあなたが上の制約を置きたいと思うものは何でも実体含める関係に沿って移動し、関係を中心に構成されています。だから、

SELECT t FROM Task t JOIN t.collaborators c JOIN c.user u JOIN u.roles r 
WHERE r.name = :role AND t.done = :done 

このように、単に永続性の構築であり、クエリには関係のない「結合テーブル」は参照しません。

関連する問題