JPA joindre au printemps de démarrage de l'application
J'ai lu des exemples, mais ont ma question personnelle pour vous.
J'ai 2 tables:
Role:
id, name
User:
id, login, name, role_id
Rôle de l'entité
@Entity
@Table(name = "role")
public class Role {
@Id
@Column(name = "id")
private long id;
@Column(name = "name", length = 45)
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "role")
private Set<User> user = new HashSet<>();
//getters and setters
Entité utilisateur
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id",insertable = false, updatable = false)
private long id;
@Column(name = "login")
private String login;
@Column(name = "user_name")
private String userName;
@ManyToOne(fetch = FetchType.LAZY)
private Role role;
//getters and setters
Et référentiel:
public interface UserRepository extends JpaRepository<User, Long> {
String Q_GET_ALL_USERS = "from User u left join Role r on u.role_id=r.id";
@Query(Q_GET_ALL_USERS)
Collection<User> getAllUsers();
Ce code montre: Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [from com.example.jpa.model.User u left join Role r on u.role_id=r.id]
Comment je comprends l'entité ne peut pas contient 'id' (dans mon cas en Role
) pour les références et, devrais-je supprimer ce champ. Mais l'entité qui devrait avoir "@Id".
Dans ce cas, je devrais créer une nouvelle colonne dans le "Rôle"? ou je peux utiliser plus belle décision?
J'ai mis tout projet de bb
vous avez oublié les "SÉLECTIONNEZ u" dès le début de votre JPQL.
Oui, j'ai oublié
Oui, j'ai oublié
select u
OriginalL'auteur qizer | 2016-02-02
Vous devez vous connecter pour publier un commentaire.
Utiliser jointure dans les requêtes HQL (JPQL) vous n'avez pas besoin
on
clauseCette requête n'a pas aucun sens parce que vous n'utilisez pas
role
dans la clause where.Si vous souhaitez obtenir des utilisateurs avec un récupérés rôle que vous pouvez utiliser
join fetch
Mise à jour
Votre schéma pour
User
etRole
n'est pas couramment utilisé. J'ai des conseils à vous faire@ManyToMany
association de l'utilisateur de rôles et de supprimer touteuser
association de laRole
Vous êtes les bienvenus 🙂
Aussi j'ai une question à propos de "rôle" de l'entité. J'ai lu que
@OneToMany
doit s'agir d'un ensemble (Set). Je peux faire toutes les modifications dans le code et, au lieu deSet<User> user
utilisationUser user
(sans collection)?Pas de. Vous avez besoin d'une collection pour la
@OneToMany
association —Set
ouList
. - Je mettre à jour ma réponse.pour le conseiller d'utiliser
@ManyToMany
association. Mais pourquoi leRole
dansUser
classe n'est pas uneList
ouSet
?OriginalL'auteur v.ladynev
Non, vous devez créer une nouvelle colonne dans
User
.@OneToMany
avecmappedBy
Hibernate utilise@JoinColumn
par défaut.Merci Romain, pour l'aide 🙂
C'est un rappel que vous devez accepter la réponse qui vous a aidé.
OriginalL'auteur Roman C
Merci à vous tous pour les réponses. Droit des entités et à la requête ci-dessous (plus tableaux de schéma).
Tables (requêtes)
Entités:
et
Référentiel
@v-ladynev alternative proposée décision(à utiliser uniquement
@ManyToMany
dansUser
). Plus de détails vous pouvez trouver dans les commentaires sous cette réponse.Quand je vérifie cette décision, je mettrai à jour cette réponse (j'espère que je n'oublie pas :-))
OriginalL'auteur qizer
OriginalL'auteur Ram Pukar