Grails中的distinct,oracle和CLOB出错

时间:2015-08-02 22:55:15

标签: oracle hibernate grails clob

我有一个用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:不一致的数据类型:预期 - 获得CLOB

我知道Grails / Hibernate使用域类的所有属性来使sql发送到数据库并作为该类的实例返回。 这种情况是我只需要比较或分组域类的id来区分,但我需要结果是类的实例而不是id,所以我不需要更改所有查询

即使我需要自定义方言来捕获Hibernate在SQL中转换HQL时所做的事情,你们中的任何人都知道改变HQL中不同行为的方法吗?

我的想法是捕获SQL,将其更改为返回并仅对实例的id进行分组,并在将其返回到“executeQuery”之前在Domain类中执行“get”。

1 个答案:

答案 0 :(得分:0)

该解决方案仅适用于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;