【问题标题】:Error with distinct, oracle and CLOB in GrailsGrails 中的 distinct、oracle 和 CLOB 出错
【发布时间】:2015-10-24 23:27:40
【问题描述】:

我有一个用 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 中包含一些 CLOBs 列来扩展 VarChar 4000 中的一些字段。当我这样做时,由于 Oracle 不比较 CLOB 列的问题,这些查询停止工作。

错误:

ORA-00932:不一致的数据类型:预期 - 得到 CLOB

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

即使我需要自定义一种方言来捕捉 Hibernate 在 SQL 中转换 HQL 时所做的工作,你们中的任何人都知道改变 HQL 中 distinct 的行为的方法吗?

我的想法是捕获 SQL,将其更改为仅返回和分组实例的 id,并在 Domain 类中执行“get”,然后将其返回给“executeQuery”。

【问题讨论】:

    标签: oracle hibernate grails clob


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 2014-06-18
      • 1970-01-01
      相关资源
      最近更新 更多