2017-04-05 1 views
0

Comme le titre l'indique, j'essaie de sélectionner à la fois le nom d'utilisateur et le nom de rôle en utilisant la requête suivante.Sélectionnez le nom d'utilisateur et le nom de rôle

select u.username, r.name 
from users u, role r 
inner join users_roles ur 
    on ur.user_id = u.id 
where username = ?; 

Cependant, je reçois l'erreur ci-dessous

[2017-04-05 21:34:49] [42P01] ERROR: invalid reference to FROM-clause entry for table "u" 
[2017-04-05 21:34:49] Hint: There is an entry for table "u", but it cannot be referenced from this part of the query. 
[2017-04-05 21:34:49] Position: 79 

Mon entité utilisateur est la suivante

@Entity(name = "users") // Postgres doesn't like the table name "user" 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    private String username; 
    ... 

    @ManyToMany 
    @JoinTable(
      name = "users_roles", 
      joinColumns = @JoinColumn(
        name = "user_id", referencedColumnName = "id"), 
      inverseJoinColumns = @JoinColumn(
        name = "role_id", referencedColumnName = "id")) 
    private Collection<Role> roles; 
... 

Et mon entité rôle est comme suit

@Entity 
public class Role { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    private String name; 
    @ManyToMany(mappedBy = "roles") 
    private Collection<User> users; 
... 

Tous des indices sur ce que je fais wro ng?

Répondre

0
SELECT users.username, role.name 
FROM users 
LEFT OUTER JOIN users_roles 
    ON users.id = users_roles.user_id 
LEFT OUTER JOIN role 
    ON users_roles.role_id = role.id 
WHERE username = ? 
+0

Veuillez ajouter du contexte à cette réponse. Que fait cette requête? Comment cela résout-il la question originale? –

+0

La requête renvoie une liste de tuples où la première colonne est un nom d'utilisateur et la seconde est le nom du rôle. J'utilise cela en conjonction avec la sécurité du printemps. – user672009