[Hibernate] Auto jointure possible?
Bonjour à tous !
Je travaille avec Hibernate 2.1.6.
J'ai une classe :
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 40 41 42 43 44 45 46 47 48 49 50 51 52
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping
>
<class
name="domain.frequency.StatusChange"
table="T_STATUS_CHANGE"
dynamic-update="false"
dynamic-insert="false"
select-before-update="false"
optimistic-lock="version"
>
<cache usage="read-write" />
<composite-id
name="id"
class="data.frequency.StatusChangeId"
>
<key-property
name="cxrId"
type="java.lang.Long"
column="cxr_id"
/>
<key-property
name="changeDate"
type="java.sql.Timestamp"
column="cxrstat_change_date"
/>
</composite-id>
<property
name="status"
type="int"
update="true"
insert="true"
access="property"
column="cxrstat_status"
not-null="true"
/>
</class>
</hibernate-mapping> |
et je me demandais comme traduire en HQL cette requête écrite en SQL :
Code:
1 2 3 4 5 6 7 8 9
|
select * from t_status_change s
inner join
(select max(cxrstat_change_date) as maxtime, cxr_id from t_status_change where cxrstat_change_date < '2009-10-01' group by cxr_id) mdt
on mdt.maxtime = s.cxrstat_change_date
and mdt.cxr_id = s.cxr_id
where (s.cxr_id = 5664 or s.cxr_id = 5649 or s.cxr_id = 5668 or s.cxr_id = 5645 )
; |
J'explique ce que fait cette requête :
- Elle renvoit une ligne par s.cxr_id présents dans la clause where, donc ici elle renverra 4 lignes.
- Et chacune de ces lignes est la plus proche de '2009-10-01' SANS dépasser.
En fait je reviens du forum MySQL ou l'on m'a aidé pour écrire cette requête :D
Donc je l'ai tapé dans mon client MySQL Query Browser, et elle fait bien ce que je veux !
Et là, c'est le drame : Comment traduire ça en HQL, je m'en remet à vous ... :D
Si c'est pas faisable je taperais du code natif SQL, mais c'est par curiosité, si vous étiez dans cette situation que feriez vous??
Je rappelle l'objectif : "pour chaque cxr_id je veux une et une seule ligne telle que la date de cette ligne soit la plus proche de la date spécifiée sans la dépasser"
Merci d'avance :)