Bonjour à tous !
Je travaille avec Hibernate 2.1.6.
J'ai une classe :
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
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>
J'explique ce que fait cette requête :
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 ) ;
- 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![]()
Partager