Ошибка с отличным, oracle и CLOB в Grails

У меня есть приложение, написанное на grails 2.2.5, которое должно подключаться к MySQL, Oracle и SQL Server в зависимости от моих клиентов. У нас есть более 1000 запросов, в которых используются отдельные возвращаемые экземпляры классов.

Пример:

import br.com.aaf.auditoria.*

def query="select distinct tipo from Atividade c join c.tipoAtividade tipo order by tipo.nome"

def ret=Atividade.executeQuery(query)

Пока все хорошо, но теперь мне нужно включить некоторые столбцы CLOB в oracle, чтобы расширить некоторые поля из VarChar 4000. Когда я это сделаю, эти запросы перестают работать из-за проблемы, заключающейся в том, что Oracle не сравнивает столбцы CLOB.

Ошибка:

ORA-00932: несогласованные типы данных: ожидалось - получил CLOB

Я понимаю, что Grails / Hibernate использует все свойства класса домена, чтобы sql отправлялся в базу данных и возвращался как экземпляр этого класса. Дело в том, что мне нужно только сравнить или сгруппировать идентификатор класса домена, чтобы выделить его, но мне нужно, чтобы результат был экземпляром класса, а не идентификатором, поэтому мне не нужно изменять все запросы .

Кто-нибудь из вас знает способ изменить поведение отдельного HQL в HQL, даже если мне нужно настроить диалект, чтобы уловить, что Hibernate делает при преобразовании HQL в SQL?

Я думаю, что захватить SQL, изменить его, чтобы вернуть и сгруппировать только идентификатор экземпляра, и выполнить «get» в классе домена, прежде чем вернуть его в «executeQuery».


person Werther Doria    schedule 02.08.2015    source источник


Ответы (1)


Решение подходит только для Oracle db. Вы должны предоставить своей схеме некоторые привилегии. «Создать типы» и «выполнить на DBMS_CRYPTO»

create table clob_test (id number, lob clob);

insert all 
  into clob_test values(1,'AAAAAAAA')
  into clob_test values (2,'AAAAAAAA')
  into clob_test values(3,'BBBBBBBB')
  into clob_test values(4,'BBBBBBBB')
  select * from dual;
commit;

CREATE OR REPLACE 
type wrap_lob as object(
  lob clob,
  MAP MEMBER FUNCTION get_hash RETURN RAW
)
;
/

CREATE OR REPLACE 
TYPE BODY wrap_lob is

  MAP MEMBER FUNCTION get_hash RETURN RAW is
  begin
    return DBMS_CRYPTO.HASH(lob,1);
  end;
end;
/


select tab.dist_lob.lob from (select distinct wrap_lob(lob) dist_lob from clob_test) tab;
person Arkadiusz Łukasiewicz    schedule 03.08.2015