4 votes

Prise en charge par Hibernate des jointures de listes Oracle Array

Oracle supporte une syntaxe de requête où une table est jointe à un type de collection Oracle (Nested table ou VARRAY). Cette sémantique peut être utilisée à la place de la syntaxe in (1,2,3) de SQL, et permet de lier un tableau de valeurs à la requête. Ceci peut être fait en utilisant le pilote JDBC d'Oracle.

Ce type de requête est connu sous le nom de Pickler Fetch. Il est beaucoup plus évolutif que l'utilisation de listes SQL IN. Mon application pourrait avoir ~10 000 valeurs dans la collection.

Mon problème est que je suis nouveau dans Hibernate (nous utilisons Hibernate 3.2.5 et Spring 2.0.6) et je ne vois pas comment cette sémantique peut être mise en œuvre avec Hibernate. Typiquement, une implémentation JDBC fonctionnerait comme suit : Définir un type défini par l'utilisateur dans la base de données en utilisant CREATE type dans SQL*Plus. CREATE OR REPLACE TYPE NUMBER_LIST_TYPE AS TABLE OF number ;

En Java :

import java.sql.*;
import oracle.sql.ArrayDescriptor;
import oracle.sql.ARRAY;
import oracle.jdbc.*;

/* The oracle collection is described */
            ArrayDescriptor oracleCollection = 
                ArrayDescriptor.createDescriptor("NUMBER_LIST_TYPE",conn);

PreparedStatement stmt = conn.prepareStatement(
             " SELECT ename,empno FROM emp                                "
            +"  WHERE empno IN (                                          "
            +"   SELECT * FROM   TABLE( CAST ( ? as NUMBER_LIST_TYPE ) )  "
            +"   )                                                        "
            );

/* define our java array */
            int[] javaArray1 = { 7369,7566,7782 };

            /* define our oracle array */
            ARRAY jdbcArray1 = new ARRAY (oracleCollection, conn, javaArray1);

            /* bind that array to our statement bind variable */
            stmt.setObject(1,jdbcArray1);

            /* execute the query and browse the result */
            ResultSet r=stmt.executeQuery(); 
            while(r.next()){ 
             System.out.println(
                "\t"+"\t"+r.getString(2)+": "+r.getString(1)); 
            }

Maintenant, comment puis-je mettre en œuvre quelque chose comme cela en utilisant Hibernate ?

0voto

whomer Points 141

J'ai poursuivi mes recherches, et si nous passons à la version actuelle d'Hibernate, je pourrais créer mon propre DAO JDBC. Je devrais implémenter l'interface org.hibernate.jdbc.Work, mais c'est faisable. Il s'agirait de travailler autour d'Hibernate. Un exemple de l'approche est ici : http://www.informit.com/guides/content.aspx?g=java&seqNum=575

J'aimerais néanmoins savoir s'il existe une meilleure façon de procéder. D'autant plus que l'interface de travail n'est pas disponible dans la version 3.2.5.

-1voto

Michael Shopsin Points 830

Il s'agit d'une option purement personnelle issue de projets passés, mais la combinaison d'Oracle, d'Hibernate et de Spring n'est pas stable. La vision d'Hibernate sur les transactions ne correspond pas à celle d'Oracle, et lorsque les choses échouent, elles ont tendance à se propager en cascade à travers les composants Spring.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X