2016-12-11 4 views
0

Ich habe 4 Personen und einem Tisch sitzen und ich möchte eine Abfrage wie folgt machen:Tabelle Join-Abfrage: Tabelle wird nicht abgebildet

Mitarbeiter:

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

...} 

Benutzer:

@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<>(); 
...} 

Rolle:

@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; 
... } 

Aufgabe:

@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<>(); 
...} 

Mein Problem:

Ist ich Aufgaben nach Rolle holen will, und ich versuchte, diese Anfrage:

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

aber ich habe ein Fehler:

users_roles is not mapped 

Jeder Vorschlag sehr willkommen ist, Danke

+0

Sie haben also keine ENTITY namens "users_roles", wie die Nachricht deutlich genug sagt. Und ? In JPQL verwenden Sie JOIN über RELATIONS hinweg. Du postest deine Kurse nicht, also wie kann jemand vorschlagen, was JOINs macht? JPQL! = SQL –

+0

Meine Klassen sind dafür nicht erforderlich, und ich erwähnte, dass ich 4 Entitäten und 1 zusammenfügbar habe (es ist klar, dass ich eine vieleTomany-Beziehung habe) und erwähnte auch die JoinTableLinksRolle und BenutzerEntitäten. –

+0

Mein Problem ist vielleicht die Frage: Wie kann ich auf eine Join-Tabelle von JPQL –

Antwort

1

JPQL um Beziehungen strukturiert ist, so navigieren nur entlang der Beziehungen, was auch immer Elemente, die Sie auf Einschränkungen setzen wollen aufzunehmen. Also, so etwas wie

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 

Folglich Sie verweisen nicht jeder „Join-Tabelle“, die einfach eine Persistenz Konstruktion ist und irrelevant abfragt.

Verwandte Themen