Bonjour à tous !

Je travaille avec Hibernate 2.1.6.

J'ai une classe :

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
 
<?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 : Sélectionner tout - Visualiser dans une fenêtre à part
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

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 ...
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