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