Oracle поддерживает синтаксис запроса, в котором таблица объединяется с типом коллекции Oracle (вложенная таблица или VARRAY).Эта семантика может использоваться вместо синтаксиса in (1,2,3) в SQL и позволяет связать массив значений с запросом.Это можно сделать с помощью драйвера JDBC Oracle.
Этот тип запроса известен как выборка Pickler.Это гораздо более масштабируемо, чем использование SQL IN Lists.Мое приложение может иметь ~ 10000 значений в коллекции.
Моя проблема в том, что я новичок в Hibernate (мы используем Hibernate 3.2.5 и Spring 2.0.6) и не вижу, как можно реализовать эту семантикуиспользуя Hibernate.Обычно реализация JDBC работает следующим образом: определяйте пользовательский тип в базе данных, используя тип CREATE в SQL * Plus. CREATE ИЛИ ЗАМЕНИТЕ ТИП NUMBER_LIST_TYPE AS TABLE OF number;
В 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));
}
Теперь, как я могу реализовать что-то подобное с помощью Hibernate?