oracle - Grails中与众不同,oracle和CLOB错误

标签 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: 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/

相关文章:

sql - SQL*Loader 的日期格式

hibernate - 我需要在 Maven 依赖项中指定 PostgreSQL 方言吗?

spring - 将 bean 与数据源绑定(bind)

oracle - 带时区的 hibernate 时间戳

sql - Oracle 转换(时间戳为日期)

java - JPA PessimisticLockScope.NORMAL 和锁定 "relationships"

以 Groovy 方式修改 JSF?

image - 带有Grails资源插件的图片网址

sql - 更新语句是否不受竞争条件的影响?

database - Actionscript-3 类 Hibernate 框架