oracle - Grails 3 - 按 CLOB 值查找对象

标签 oracle grails clob

针对 Oracle 12g 运行 grails 3.2.10。我有一个带有 CLOB 字段的域,我正在尝试查找该域中在该字段中具有特定值的所有实例。

class SomeDomain {
  String name
  String value

  static mapping = {
    value sqlType: 'CLOB'
  }
}

我意识到 Oracle 不允许 CLOB 值的直接相等比较......例如,
SELECT * FROM some_domain where value = 'myValue'

会失败,但是
SELECT * FROM some_domain where dbms_lob.compare(value, 'myValue') = 0

给出正确的结果。

但是,当我尝试执行 HQL 或 Criteria 查询以在 grails 中检索它时,它正在尝试直接相等比较,并抛出异常。
SomeDomain.findAllByValue('myValue') --> ORA-00932: inconsistent datatypes: expected - got CLOB

好像我已经指示 grails 将此列视为 CLOB,有没有办法说服它使用 dbms_lob特定查询的比较?

我也愿意接受任何其他建议......我很惊讶我在任何地方都找不到这个问题,也许我只是不擅长搜索。

最佳答案

我是 Grails 的新手,所以我在这里猜测。但我有几个想法可以尝试。

而不是 value sqlType: 'clob' , 我看过 some people suggest你应该使用value type: 'text' , 或 value type: 'materialized_clob' .但我不确定这些实际上有什么不同。

或者,我认为您可以使用 Hibernate SQL Restrictions,而不是使用 findAllBy*。在 native sql 中进行查询。

def c = SomeDomain.createCriteria()

def clobEquals = c.list {
  sqlRestriction "dbms_lob.compare(value, ?) = 0", ['myValue']
}

(我实际上没有尝试过。)

最后,作为一种解决方法,您可以将 LIKE 与 clob 一起使用,并且不包括通配符,它​​相当于 =
SomeDomain.findAllByValueLike('myValue')

不过,这可能不适用于大字符串变量。

关于oracle - Grails 3 - 按 CLOB 值查找对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46974900/

相关文章:

jquery - Grails:标签 [remotelink] 不存在。找不到 namespace 的标记库:g

java - 使用 getCharacterStream API 读取 Clob 对象导致 "java.sql.SQLException: could not reset reader"

java - CLOB 不保存在 ORACLE 上(使用 JPA、eclipselink)

grails,仅将当前 url 中的现有参数添加到分页

java - 在 Oracle : mapping String property to CLOB column 上 hibernate

arrays - Oracle PL/SQL 中数组、循环的语法

mysql - 为每个页面加载查询我的数据库是否安全?

oracle - 获取oracle sqlplus中sql脚本的执行时间

mysql - 无法从案例陈述中检索准确的结果

grails - Grails GSP-无法使用参数调用主体