Grails 3 - 按CLOB值查找对象

时间:2017-10-27 12:20:57

标签: 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比较?

我对任何其他建议持开放态度......相当惊讶我无法在任何地方找到这个问题,也许我只是不善于搜索。

1 个答案:

答案 0 :(得分:1)

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

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

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

def c = SomeDomain.createCriteria()

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

(我实际上没有试过这个。)

最后,作为一种解决方法,可以使用LIKE和clobs,并且不包含通配符,它​​等同于=

SomeDomain.findAllByValueLike('myValue')

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