2010-10-20 2 views
4

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?

ответ

0

Я исследовал дальше, и если мы перейдем к текущей версии Hibernate, я смогу создать свой собственный JDBC DAO. Я должен был бы реализовать интерфейс org.hibernate.jdbc.Work, но это выполнимо. Он будет работать в спящем режиме. Примером такого подхода является: http://www.informit.com/guides/content.aspx?g=java&seqNum=575

Я все еще хотел бы знать, есть ли лучший способ сделать это. Тем более, что рабочий интерфейс недоступен в 3.2.5

+0

К сожалению, этот подход не работает с спящим режимом. Утвержденный оператор Hibernate не поддерживает расширения Oracle. Я не большой поклонник ORM, и это еще одна причина. – whomer

0

Это чисто персонализированный вариант из прошлых проектов, но комбинация Oracle, Hibernate и Spring нестабильна. Взгляд Hibernate на транзакции не совпадает с Oracle, и когда что-то происходит, они имеют тенденцию к каскаду вверх через компоненты Spring.

+0

Это не ответ. У меня нет выбора, будем ли мы использовать Hibernate или Oracle в проекте. Его установленная база кода с большим количеством спящего кода. Oracle является стандартом компании. – whomer

Смежные вопросы