Bonjour,

Je débute avec Hibernate, j'ai crée 2 "entitys" en rapport avec deux tables d'une base PostgreSQL:

Table utilisateur:
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;
	}
}
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
@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;
	}
}
J'ai supprimé les "setters" car je ne fais que de la lecture.

Ensuite je rempli un modèle en faisant une requête qui lie ces deux tables:

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();
}
Hors la Hibernate me fait le requête:

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
Il me remplit rien après le "on" ce qui donne une exception "ERROR: syntax error at end of input".

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:

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 ";
Bon le je précise le "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 !