针对 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/