Поддержка гибернации для присоединения к списку Oracle Array - PullRequest
4 голосов
/ 20 октября 2010

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?

Ответы [ 2 ]

0 голосов
/ 20 октября 2010

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

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

0 голосов
/ 20 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...