Je te remercie lauvigne. J'ai résolu mon prb. La requête que je voulais faire
en native fonctionne. Pour les curieux, la voici :
StringBuffer reqRechTaches = new StringBuffer("SELECT {tache.*}, {agent.*}, {agentParAutomate.*}, {transfert.*} , {fichier.*}, {machine.*} ");
reqRechTaches.append("FROM TACHE_ELEMENTAIRE {tache}, AGENT {agent}, AGENT_PAR_AUTOMATE {agentParAutomate}, TRANSFERT {transfert}, ");
reqRechTaches.append("FICHIER {fichier}, MACHINE {machine} ");
reqRechTaches.append("WHERE (({tache}.agent_id_fk = {agent}.agent_id) AND ({agent}.agent_id = {agentParAutomate}.agent_id_fk) AND ");
reqRechTaches.append("({transfert}.transfert_id = {tache}.transfert_id_fk) AND ({tache}.fichier_id_fk = {fichier}.fichier_id) AND ");
reqRechTaches.append("({agent}.machine_id_fk = {machine}.machine_id)) ");
reqRechTaches.append("AND {transfert}.statut_id_fk NOT IN (5, 6, 7, 8) ");
reqRechTaches.append("AND {tache}.statut_id_fk NOT IN (5, 6, 7, 8) ");
reqRechTaches.append("AND {agentParAutomate}.automate_id_fk = :automateId ");
reqRechTaches.append("AND {transfert}.date_declenchement < SYSDATE ");
reqRechTaches.append("AND ({tache}.date_debut_planifiee IS NULL OR {tache}.date_debut_planifiee < SYSDATE) ");
reqRechTaches.append("AND ({agent}.demarre = 1) AND ({agent}.actif = 1) ");
reqRechTaches.append("AND NOT EXISTS ");
reqRechTaches.append(" (SELECT NULL from Predecesseur PR1 WHERE PR1.tache_elementaire_id_fk = {tache}.tache_elementaire_id) ");
reqRechTaches.append("UNION ALL ");
reqRechTaches.append("SELECT {tache.*}, {agent.*}, {agentParAutomate.*}, {transfert.*} , {fichier.*}, {machine.*} ");
reqRechTaches.append("FROM TACHE_ELEMENTAIRE {tache}, AGENT {agent}, AGENT_PAR_AUTOMATE {agentParAutomate}, TRANSFERT {transfert}, ");
reqRechTaches.append("FICHIER {fichier}, MACHINE {machine} ");
reqRechTaches.append("WHERE (({tache}.agent_id_fk = {agent}.agent_id) AND ({agent}.agent_id = {agentParAutomate}.agent_id_fk) AND ");
reqRechTaches.append("({transfert}.transfert_id = {tache}.transfert_id_fk) AND ({tache}.fichier_id_fk = {fichier}.fichier_id) AND ");
reqRechTaches.append("({agent}.machine_id_fk = {machine}.machine_id)) ");
reqRechTaches.append("AND {transfert}.statut_id_fk NOT IN (5, 6, 7, 8) ");
reqRechTaches.append("AND {tache}.statut_id_fk NOT IN (5, 6, 7, 8) ");
reqRechTaches.append("AND {agentParAutomate}.automate_id_fk = :automateId ");
reqRechTaches.append("AND {transfert}.date_declenchement < SYSDATE ");
reqRechTaches.append("AND ({tache}.date_debut_planifiee IS NULL OR {tache}.date_debut_planifiee < SYSDATE) ");
reqRechTaches.append("AND ({agent}.demarre = 1) AND ({agent}.actif = 1) ");
reqRechTaches.append("AND {tache}.tache_elementaire_id IN ( ");
reqRechTaches.append(" SELECT PR2.tache_elementaire_id_fk ");
reqRechTaches.append(" FROM tache_elementaire TA3, Predecesseur PR2 ");
reqRechTaches.append(" WHERE (PR2.predecesseur_id = TA3.tache_elementaire_id) AND TA3.statut_id_fk IN (7)) ");
long cputime1 = System.currentTimeMillis();
List hqlRechTaches = session.getSession().createSQLQuery(reqRechTaches.toString(),
new String[]{"tache", "agent", "agentParAutomate", "transfert", "fichier", "machine"},
new Class[]{TacheElementaire.class, AgentStf.class, AgentParAutomate.class, Transfert.class, Fichier.class,
Machine.class})
.setParameter("automateId", pNomAutomate, Hibernate.STRING)
.list();
if (sLogger.isDebugEnabled()) {
sLogger.debug("Temps REQ=/#" + (System.currentTimeMillis() - cputime1));
}
1) La requête fonctionne trés bien mais je ne pensais pas que le natif Hibernate serait aussi couteux. La requête s'execute en 4 secondes.
C'est un temps encore beaucoup trop pour mon application. A part
récupérer une connexion pour faire du FULL JDBC, qui sait comment
faire pour améliorer le temps d'éxécution de ma requête ?
2) SUr DBVisualizer elle ne mets que 0.063 sec pour s'éxécuter. Est-ce
que les secondes en plus sont dûes à la reflection (ou le traitement en
général) fait par Hibernate ?
|