Bonjour,
Je débute avec Hibernate, j'ai crée 2 "entitys" en rapport avec deux tables d'une base PostgreSQL:
Table utilisateur:
lié à une table "evenement" dont le champ "evenement" pointe sur le champ clef de la table utilisateurs:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 @Entity @Table(name = "utilisateurs", schema = "donnees") public class Utilisateurs implements Serializable { private static final long serialVersionUID = -4453859136286916778L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "clef", nullable = false) private Long clef; @Column(name = "libelle", length = 255, nullable = false) private String libelle; @OneToMany(mappedBy="utilisateurs") List<Evenements> evenements; public Long getClef() { return clef; } public String getLibelle() { return libelle; } public List<Evenements> getEvenements() { return evenements; } }
J'ai supprimé les "setters" car je ne fais que de la lecture.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 @Entity @Table(name = "evenements", schema = "donnees") public class Evenements implements Serializable { private static final long serialVersionUID = 6231540557299889809L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "clef", nullable = false) private Long clef; @ManyToOne private Utilisateurs utilisateurs; @Column(name = "description", length = 255, nullable = false) private String description; public Long getClef() { return clef; } public Utilisateurs getUtilisateurs() { return utilisateurs; } public String getDescription() { return description; } }
Ensuite je rempli un modèle en faisant une requête qui lie ces deux tables:
Hors la Hibernate me fait le requête:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public List<UtilisateursInfo> listUtilisateursInfo() { String sql = "Select new "+UtilisateursInfo.class.getName()+"(u.clef as idUtilisateur,u.libelle,e.clef as idEvenement,e.description) "; sql += "from " + Evenements.class.getName() + " e "; sql += "inner join " + Utilisateurs.class.getName() + " u "; Session session = this.sessionFactory.getCurrentSession(); Query<UtilisateursInfo> query = session.createQuery(sql, UtilisateursInfo.class); return query.getResultList(); }
Il me remplit rien après le "on" ce qui donne une exception "ERROR: syntax error at end of input".
Code : Sélectionner tout - Visualiser dans une fenêtre à part select utilisateu1_.clef as col_0_0_, utilisateu1_.libelle as col_1_0_, evenements0_.clef as col_2_0_, evenements0_.description as col_3_0_ from donnees.evenements evenements0_ inner join donnees.utilisateurs utilisateu1_ on
Si, dans les entity, je remplace les liens via des objets et que je mette à la place des "long" représentant les "ids", cela fonctionne avec la modification suivante:
Bon le je précise le "on e.utilisateur = u.clef".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 String sql = "Select new "+UtilisateursInfo.class.getName()+"(u.clef as idUtilisateur,u.libelle,e.clef as idEvenement,e.description,s.clef as idSignale,s.ip) "; sql += "from " + Evenements.class.getName() + " e "; sql += "inner join " + Utilisateurs.class.getName() + " u on e.utilisateur = u.clef ";
Mais j'aimerai savoir pourquoi Hibernate ne fait pas le lien quand je lie les deux tables par leurs objets au lieu de seulement leurs identifiants.
Merci de votre aide !
Partager