Bonjour,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <!-- TABLE : TAB_A --> <class-descriptor class="com.his.appli.domain.ClassA" table="TAB_A"> <field-descriptor name="id" column="TAB_A_ID" jdbc-type="INTEGER" primarykey="true"/> <field-descriptor name="code" column="TAB_A_CODE" jdbc-type="INTEGER"/> <field-descriptor name="date" column="TAB_A_DATE" jdbc-type="DATE" conversion="org.apache.ojb.broker.accesslayer.conversions.JavaDate2SqlDateFieldConversion"/> ... <reference-descriptor name="classB" class-ref="com.his.appli.domain.ClassB" auto-retrieve="true" auto-update="false" auto-delete="false"> <foreignkey field-ref="code" /> <foreignkey field-ref="date" /> </reference-descriptor> </class-descriptor>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <!-- TABLE : TAB_B --> <class-descriptor class="com.his.appli.domain.ClassB" table="TAB_B"> <field-descriptor name="code" column="TAB_B_CODE" jdbc-type="INTEGER" primarykey="true"/> <field-descriptor name="date" column="TAB_B_DATE" jdbc-type="DATE" primarykey="true" conversion="org.apache.ojb.broker.accesslayer.conversions.JavaDate2SqlDateFieldConversion"/> ... </class-descriptor>
But de la requête :
Ramener les objets de type ClassA (cette classe contient donc un objet de type ClassB)
2 solutions dans mon DAO :
--> ça dure 6 minutes (6594 éléments)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 QueryByCriteria query = new QueryByCriteria(ClassA.class, criteria); return (Collection<ClassA>) super.getPersistenceBrokerTemplate().getCollectionByQuery(query);
ou en dur pour voir :
--> ça dure 9 minutes (6594 éléments)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 String querySQL = "bla, bla, bla..."; QueryBySQL query = new QueryBySQL(ClassA.class, querySQL); return (Collection<ClassA>) super.getPersistenceBrokerTemplate().getCollectionByQuery(query);
Mon problème, c'est que pourtant la même requête que j'ai testé en dur (solution 2) ne prend... que 6 secondes quand je l'exécute sous SQL Developer!! (toujours mes 6594 éléments, ça montre que ça se passe correctement dans tous les cas).
Je ne comprend pas ce qui ne va pas; quand je trace les requêtes, je vois qu'Hibernate me construit des trucs bizarres, des tas de conditions en cascade de :
mais je n'ai aucune piste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 OR ((A0.TAB_B_CODE = ?) AND A0.TAB_B_DATE = ?) OR ((A0.TAB_B_CODE = ?) AND A0.TAB_B_DATE = ?) OR ((A0.TAB_B_CODE = ?) AND A0.TAB_B_DATE = ?) ...
Merci aux spécialistes de m'aiguiller...
PS : au début j'avais juste les champs de la ClassA (sans jointure) et ça allait bien plus vite. C'est donc cette jointure qui me prend du temps (c'est quasiment instantané de me retourner ces 6594 éléments sans les infos supplémentaires récupérées dans la ClassB
Partager