Bonjour,

J’essaie de faire un petit exemple sur une relation N :N (many-to-Many), j’ai une classe Proprietaire:

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
33
34
35
36
37
38
39
40
41
42
package com.hibernate.dao.proprietaire;
 
import java.util.Set;
 
import com.hibernate.dao.voiture.Voiture;
 
public class Proprietaire {
 
	private String nom;
	private Set<Voiture> voitures;
	private Integer id;
 
	public void setNom(String nom) {
		this.nom = nom;
	}
 
	public String getNom() {
		return nom;
	}
 
	public void setVoitures(Set<Voiture> voitures) {
		this.voitures = voitures;
	}
 
	public Set getVoitures() {
		return voitures;
	}
 
 
	public void setId(Integer id) {
		this.id = id;
	}
 
	public Integer getId() {
		return id;
	}
 
	public String toString(){
		return "Identification: " + "[Nom," +  getNom() +  "] " ;   
	}
 
}
et une classe Voitrue:

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
33
34
35
36
37
38
39
40
41
42
package com.hibernate.dao.voiture;
 
import java.util.Set;
 
import com.hibernate.dao.proprietaire.Proprietaire;
 
public class Voiture {
 
	private String model;
	private Set<Proprietaire> proprietaires;
	private Integer id;
 
	public String getModel() {
		return model;
	}
 
	public void setModel(String model) {
		this.model = model;
	}
 
	public Set getProprietaires() {
		return proprietaires;
	}
 
	public void setProprietaires(Set<Proprietaire> proprietaires) {
		this.proprietaires = proprietaires;
	}
 
	public Integer getId() {
		return id;
	}
 
	public void setId(Integer id) {
		this.id = id;
	}
 
	public String toString(){
		return this.model;
	}
 
 
}

une voiture peut avoir un ou plusieurs propriétaires mais aussi un propriétaire peut avoir une ou plusieurs voitures.

Je traduis bien cette relation par un set, j’utilise bien la package java.util.set des deux cotés.
J’ai aussi les requête dans les fichier qui font le mapping entre les classes et la bdd.

Voici les fichier.

Proprietaire.hbm.xml

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
<hibernate-mapping package="com.hibernate.dao.proprietaire">
 
	<class name="Proprietaire">
 
		<id name="id" column="id">
			<generator class="increment"/>
		</id>
 
		<property name="nom"/>
 
 
		<set name="voitures"
			 table="Proprietaire_a_Voiture">
 
			<key column="proprietaire_id"/>
			<many-to-many 
					class="com.hibernate.dao.voiture.Voiture" 
					column="id"/>
		</set>
	</class>
 
	<query name="ChercherProprietaireNom">
		<![CDATA[from Proprietaire proprietaire left join fetch proprietaire.voitures where proprietaire.nom = :nom]]>
	</query>
 
</hibernate-mapping>
et Voiture.hbm.xml

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
<hibernate-mapping package="com.hibernate.dao.voiture">
 
	<class name="Voiture">
 
		<id name="id" column="id">
			<generator class="increment"/>
		</id>
 
		<property name="model"/>
 
 
		<set name="proprietaires"
			 table="proprietaire_a_voiture">
 
			<key column="voiture_id"/>
			<many-to-many 
					class="com.hibernate.dao.proprietaire.Proprietaire" 
					column="id"/>
		</set>
 
	</class>
 
	<query name="chercherVoitureModel">
		<![CDATA[from Voiture voiture left join fetch voiture.proprietaires where voiture.model = :model]]>
	</query>
 
 
</hibernate-mapping>
J’essaie donc de ramener une collection avec la requête qui utilise dans une classe de test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 	Query select1 = session.getNamedQuery("chercherVoitureModel");
		select1.setString("model", "Aston Martin EDB7");
		List voitures = select1.list();
 
 
		voitures = select1.setFirstResult(0)
        .setMaxResults(2)
        .list();
 
		for(Object object : voitures){
			System.out.println("Voiture : " + ((Voiture)object).toString());
			Set osDonos = ((Voiture)object).getProprietaires();
			System.out.println("");
		}
Je ne comprends pas pourquoi mais j’ai cette erreur et tout me semble quasiment correct....


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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
12:06:23,187 DEBUG SQL:324 - /* named HQL query chercherVoitureModel */ select voiture0_.id as id0_, proprietai2_.id as id1_, voiture0_.model as model0_0_, proprietai2_.nom as nom2_1_, proprietai1_.voiture_id as voiture1_0__, proprietai1_.id as id0__ from Voiture voiture0_ left outer join proprietaire_a_voiture proprietai1_ on voiture0_.id=proprietai1_.voiture_id left outer join Proprietaire proprietai2_ on proprietai1_.id=proprietai2_.id where voiture0_.model=?
Hibernate: /* named HQL query chercherVoitureModel */ select voiture0_.id as id0_, proprietai2_.id as id1_, voiture0_.model as model0_0_, proprietai2_.nom as nom2_1_, proprietai1_.voiture_id as voiture1_0__, proprietai1_.id as id0__ from Voiture voiture0_ left outer join proprietaire_a_voiture proprietai1_ on voiture0_.id=proprietai1_.voiture_id left outer join Proprietaire proprietai2_ on proprietai1_.id=proprietai2_.id where voiture0_.model=?
12:06:23,187 DEBUG AbstractBatcher:378 - preparing statement
12:06:23,203 DEBUG QueryLoader:260 - bindNamedParameters() Aston Martin EDB7 -> model [1]
12:06:23,218 DEBUG AbstractBatcher:298 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
12:06:23,218 DEBUG AbstractBatcher:416 - closing statement
12:06:23,218 DEBUG JDBCExceptionReporter:63 - could not execute query [select voiture0_.id as id0_, proprietai2_.id as id1_, voiture0_.model as model0_0_, proprietai2_.nom as nom2_1_, proprietai1_.voiture_id as voiture1_0__, proprietai1_.id as id0__ from Voiture voiture0_ left outer join proprietaire_a_voiture proprietai1_ on voiture0_.id=proprietai1_.voiture_id left outer join Proprietaire proprietai2_ on proprietai1_.id=proprietai2_.id where voiture0_.model=?]
java.sql.SQLException: Unknown column 'proprietai1_.id' in 'field list'
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2975)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1600)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1695)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3026)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1137)
	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1231)
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:75)
	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:120)
	at org.hibernate.loader.Loader.getResultSet(Loader.java:1272)
	at org.hibernate.loader.Loader.doQuery(Loader.java:391)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)
	at org.hibernate.loader.Loader.doList(Loader.java:1593)
	at org.hibernate.loader.Loader.list(Loader.java:1577)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:395)
	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:271)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:844)
	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)
	at com.hibernate.test.Test.main(Test.java:95)
12:06:23,218  WARN JDBCExceptionReporter:71 - SQL Error: 1054, SQLState: 42S22
12:06:23,218 ERROR JDBCExceptionReporter:72 - Unknown column 'proprietai1_.id' in 'field list'
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
	at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:70)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.loader.Loader.doList(Loader.java:1596)
	at org.hibernate.loader.Loader.list(Loader.java:1577)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:395)
	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:271)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:844)
	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)
	at com.hibernate.test.Test.main(Test.java:95)
Caused by: java.sql.SQLException: Unknown column 'proprietai1_.id' in 'field list'
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2975)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1600)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1695)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3026)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1137)
	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1231)
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:75)
	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:120)
	at org.hibernate.loader.Loader.getResultSet(Loader.java:1272)
	at org.hibernate.loader.Loader.doQuery(Loader.java:391)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)
	at org.hibernate.loader.Loader.doList(Loader.java:1593)
	... 6 more

Je vous remercie pour d’éventuelles réponses.