针对 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
比较?
我对任何其他建议持开放态度......相当惊讶我无法在任何地方找到这个问题,也许我只是不善于搜索。
答案 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')
但这可能不适用于大字符串变量。