Grails 3 - 按 CLOB 值查找对象

Grails 3 - Find object by CLOB value

运行 grails 3.2.10 对抗 Oracle 12g。我有一个域的字段是 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 的新手,所以我有点猜测。但我有几个想法可以尝试。

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

或者,我认为您可以使用 Hibernate SQL Restrictions 在本机 sql.

中执行查询,而不是使用 findAllBy*
def c = SomeDomain.createCriteria()

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

(我还没有真正尝试过这个。)

最后,作为变通方法,您 可以 将 LIKE 与 clob 一起使用,如果不包含通配符,它​​等同于 =

SomeDomain.findAllByValueLike('myValue')

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