Hibernate 在Grails中使用like-to-non-string列

Hibernate 在Grails中使用like-to-non-string列,hibernate,grails,gorm,Hibernate,Grails,Gorm,我目前正在开发一个Grails查询服务,该服务涉及使用名为filterText的特定条件从数据库中检索行 List getAdjustmentCodes(params) { def filterText = params.filterText . . . adjustmentCodeList = AdjustmentCode.findAll{ or { ilike('description', "%$filterTe

我目前正在开发一个
Grails
查询服务,该服务涉及使用名为
filterText
的特定条件从数据库中检索行

List getAdjustmentCodes(params) {
    def filterText = params.filterText
    .
    .
    .
    adjustmentCodeList = AdjustmentCode.findAll{
        or {
            ilike('description', "%$filterText%")
            // ilike('id', "%$filterText%")
        }                       
    }

    return adjustmentCodeList
}
请注意,我注释掉了行
ilike('id',“%$filterText%”)
,因为当程序到达该行时,它会抛出一个错误:

org.springframework.core.convert.conversionfailedeexception:无法将值从java.lang.String类型转换为java.lang.Long类型…

这可能是因为该表的
id
列的类型为
long

class AdjustmentCode implements Serializable {
    Long id
    String description
    String type
    String status
    Date statusDate
    String lastUpdateBy
    Date lastUpdateDate

    static mapping = {
        table 'RFADJUSTCDOTB'
        version false
        id column : 'ADJUS_CD'
        description column : 'ADJUS_DESC'
        type column : 'ADJUS_TYPE'
        status column : 'ADJUS_STATCD'
        statusDate column : 'ADJUS_STATDTE'
        lastUpdateBy column : 'ADJUS_LUPDBY'
        lastUpdateDate column : 'ADJUS_LUPDDTE'
    }

    .
    .
    .
}
但是我需要对这个列使用
like
操作符。例如,用户希望使用类似于以下内容的
code
搜索调整:
000023123
。这是使用
like
操作符的正确方法,还是有其他方法。谢谢你的回答


我已经看到了这一点,但它没有告诉我们如何在
上使用非字符串,比如
子句中的

我喜欢
只处理
字符串(文本)。不能在其他数据类型上使用它。使用不敏感(与字符串相关)是没有意义的。这不是Grails或Hibernate的限制,而是SQL的工作方式

改为使用类似于
操作符


这个问题以前有人问过,而且(从hibernate的角度来看)。

ilike
只处理
字符串(文本)。不能在其他数据类型上使用它。使用不敏感(与字符串相关)是没有意义的。这不是Grails或Hibernate的限制,而是SQL的工作方式

改为使用类似于
操作符


这个问题以前有人问过,而且(从休眠的角度来看)。

这里有一个替代方案:

class AdjustmentCode implements Serializable {
    Long id
    String description
    .....
    String idAsString
    static mapping = {
        table 'RFADJUSTCDOTB'
        ...
        idAsString formula('to_char(id)') // Or use an equivalent fn to convert it to a String
}
然后可以使用ilike,如下所示:

ilike('idAsString', "%${filterText}%")

我想这是一个懒惰的解决办法,但它应该会起作用。

好吧,这里有一个替代方案:

class AdjustmentCode implements Serializable {
    Long id
    String description
    .....
    String idAsString
    static mapping = {
        table 'RFADJUSTCDOTB'
        ...
        idAsString formula('to_char(id)') // Or use an equivalent fn to convert it to a String
}
然后可以使用ilike,如下所示:

ilike('idAsString', "%${filterText}%")

我想这是一种懒惰的解决方法,但它应该可以工作。

刚刚尝试了
select*from table\u a,其中a.id像“%1”
,它可以工作。您使用的是什么数据库引擎?SQL规范不应允许这种情况。只需尝试从表a中选择一个a.id(如“%1”)
就可以了。您使用的是什么数据库引擎?SQL规范不应该允许这样做。如果使用普通的
比如
?e、 g.
like('id',“%$filterText%”)
如果使用普通
like
,可能会重复什么?e、 g.
类似('id',“%$filterText%”)
或的可能重复项。。。最简单的方法是将
长id
更改为
字符串id
。。。最简单的方法是将
长id
更改为
字符串id