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')
虽然这可能不适用于大字符串变量。
运行 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')
虽然这可能不适用于大字符串变量。