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 ?