我有一个用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)
到目前为止,到目前为止还不错,但是现在我需要在oracle中包括一些CLOB列以扩展VarChar 4000中的某些字段。这样做时,由于Oracle无法比较CLOB列的问题,这些查询停止了工作。
错误:
ORA-00932: inconsistent datatypes: expected - got CLOB
我知道Grails / Hibernate使用域类的所有属性来使sql发送到数据库并作为该类的实例返回。
这种情况是,我只需要比较或分组域类的ID即可使其与众不同,但我需要将结果作为该类的实例而不是ID,因此不需要更改所有查询。
即使我需要自定义一种方言来捕获Hibernate在SQL中转换HQL所做的工作,你们中的任何人都知道一种更改HQL中独特行为的方法吗?
我在想的是捕获SQL,将其更改为返回并仅将实例的ID分组,并在Domain类中执行“获取”,然后再将其返回给“executeQuery”。
最佳答案
该解决方案仅适合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;
关于oracle - Grails中与众不同,oracle和CLOB错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31777422/