hallo zusammen,
verwendet wird hibernate 3 in verbindung mit spring 1.2...
ich habe eine "one-to-many" beziehung zwischen den beiden tabellen "APERIODE1" und "APERIODEX". die zusammengehörenden daten aus den beiden tabellen kann ich nur über eine abfrage auf "APERIODEX" (über die felder akz, einrnr u. urlbnr ermitteln --> diese werden vom benutzer über ein formular eingegeben).
die abfrage (über spring's HibernateTemplate) sieht also folgendermaßen aus:
getHibernateTemplate().find("from " + table + " day where day.id.akz = ? and day.einrnr = ? and day.urlbnr = ? order by day.id.swsocc asc", criteria);
das funktioniert auch problemlos. ich bekomme korrekt alle benötigten APERIODEX datensätze und automatisch über die hibernate-mappings die dazugehörende APERIODE1.
mein problem ist aber, dass das HashSet in der APERIODE1 klasse verständlicherweise alle APERIODEX datensätze enthält, bei denen die keys passen. ich brauche aber nur jene, bei denen auch die oben in der abfrage verwendeten felder übereinstimmen (einrnr, urlbnr).
so... nun zu meiner FRAGE: wie kann ich im mapping diese zusätzliche einschränkung definieren?
die werte für die felder "einrnr" u. "urlbnr" ergeben sich natürlich erst zur laufzeit durch benutzereingabe.
ich habe trotz längerer suche kein beispiel bzw. eine lösung für diese anforderung gefunden. ich vermute, es lässt sich über eine <filter-def> im mapping angeben, aber wie das genau aussieht u. wie dann die paramter für den filter im java code gesetzt werden, habe ich nicht rausbekommen.
kann mir da bitte jemand weiterhelfen? bin für alle tipps/beispiele/lösungen sehr dankbar...
hier noch die hibernate mappings für die beiden klassen:
<class name="Aperiode1" table="APERIODE1" optimistic-lock="all" dynamic-update="true">
<composite-id name="id" class="Aperiode1Id">
<key-property name="akz" type="integer">
<column name="AKZ" />
</key-property>
<key-property name="perbeg" type="date">
<column name="PERBEG" length="10" />
</key-property>
</composite-id>
...
<property …/>
...
<!-- bi-directional one-to-many association to Aperiodex -->
<set name="aperiodexList" table="aperiodex" lazy="false" inverse="true" cascade="save-update" where="">
<key>
<column name="AKZ" />
<column name="PERBEG" />
</key>
<one-to-many entity-name="AperiodexDay"/>
<!-- HIER MUSS EINGESCHRÄNKT WERDEN, DASS NUR DATENSÄTZE BEI DENEN DIE PROPERTIES (EINRNR & URLNR) IN DER APERIODEX EINEN BESTIMMTEN WERT HABEN, DER ABER ERST ZUR LAUFZEIT ERMITTELT WIRD -->
</set>
<class name="Day" table="APERIODEX" entity-name="AperiodexDay" optimistic-lock="all" dynamic-update="true">
<composite-id name="id" unsaved-value="undefined" class="AperiodexId">
<key-property name="akz" type="integer">
<column name="AKZ" not-null="true"/>
</key-property>
<key-property name="perbeg" type="date">
<column name="PERBEG" not-null="true"/>
</key-property>
<key-property name="swsocc" type="integer">
<column name="SWSOCC" not-null="true"/>
</key-property>
</composite-id>
...
<property name="einrnr" type="long" column="EINRNR"/>
<property name="urlbnr" type="integer" column="URLBNR"/>
...
<!-- bi-directional many-to-one association to Aperiode1 -->
<many-to-one name="aperiode1" class="Aperiode1" outer-join="auto" insert="false" update="false" lazy="false">
<column name="AKZ" />
<column name="PERBEG" />
</many-to-one>
|