Ik krijg het niet voor elkaar om via een collection een zoekopdracht te doen. Om het probleem wat te verduidelijken heb ik het volgende voorbeeld:
Ik heb als voorbeeld even de volgende hibernate mappings in elkaar gezet om het probleem te verduidelijken:
Als ik de bovenstaande method uitvoer met een State object als argument dan krijg ik de volgende melding van hibernate:
illegal syntax near collection: adresses
Wat betekend deze melding en hoe moet ik dit probleem oplossen?
Ik wil dus eigenlijk alle personen hebben die in een bepaalde staat wonen, deze staat is echter geregistreerd bij het adres. En een
persoon kan één of meerdere adressen hebben.
Ik heb als voorbeeld even de volgende hibernate mappings in elkaar gezet om het probleem te verduidelijken:
code:
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
| <class name="nl.tmp.Person" table="person">
<id name="id" column="ID" type="java.lang.Integer" unsaved-value="0">
<generator class="increment"/>
</id>
<version name="version" column="VERSION" type="java.lang.Integer"/>
<set name="addresses" cascade="all" inverse="true" lazy="false" outer-join="true">
<key>
<column name="addressId"/>
</key>
<one-to-many
class="nl.tmp.Address"/>
</set>
</class>
<class name="nl.tmp.Address" table="address">
<id name="id" column="ID" type="java.lang.Integer" unsaved-value="0">
<generator class="increment"/>
</id>
<version name="version" column="VERSION" type="java.lang.Integer"/>
<many-to-one name="state"
class="nl.tmp.State"
fetch="join">
<column name="stateId"/>
</many-to-one>
</class>
<class name="nl.tmp.State" table="state">
<id name="id" column="ID" type="java.lang.Integer" unsaved-value="0">
<generator class="increment"/>
</id>
<version name="version" column="VERSION" type="java.lang.Integer"/>
<property
name="name"
type="java.lang.String"
not-null="true"
length="2">
<column name="name"/>
</property>
</class> |
code:
1
2
3
4
5
6
7
8
9
10
11
12
| public List getPersonsByState(State stateObject) {
StringBuffer sql = new StringBuffer();
sql.append("from Person as p ");
sql.append("where p.addresses.state = :state";
SessionFactory sessionFactory = getHibernateTemplate().getSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery(sql.toString());
query.setParameter("state", stateObject);
List result = query.list();
session.close();
} |
Als ik de bovenstaande method uitvoer met een State object als argument dan krijg ik de volgende melding van hibernate:
illegal syntax near collection: adresses
Wat betekend deze melding en hoe moet ik dit probleem oplossen?
Ik wil dus eigenlijk alle personen hebben die in een bepaalde staat wonen, deze staat is echter geregistreerd bij het adres. En een
persoon kan één of meerdere adressen hebben.
3015 Wp-z 5360 Wp-nno op 2 x SMA-SB3600 TL-21, Warmtepomp: ERSC-VM2CR2 / PUHZ-SHW140 YHA, WTW Q350, EV Kia Ev6 GT-Line