getCollectionByQuery : problèmes de performance sur jointure)
Bonjour,
Code:
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:
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 :
Code:
1 2
| QueryByCriteria query = new QueryByCriteria(ClassA.class, criteria);
return (Collection<ClassA>) super.getPersistenceBrokerTemplate().getCollectionByQuery(query); |
--> ça dure 6 minutes (6594 éléments)
ou en dur pour voir :
Code:
1 2 3 4
|
String querySQL = "bla, bla, bla...";
QueryBySQL query = new QueryBySQL(ClassA.class, querySQL);
return (Collection<ClassA>) super.getPersistenceBrokerTemplate().getCollectionByQuery(query); |
--> ça dure 9 minutes (6594 éléments)
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 :
Code:
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 = ?)
... |
mais je n'ai aucune piste.
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