在Grails中使用like非字符串列

时间:2015-06-08 08:54:40

标签: hibernate grails gorm

我目前正致力于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.ConversionFailedException: Failed to convert from type java.lang.String to type java.lang.Long for value...

这可能是 ,因为该表的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类似于00002312123的调整。这是使用like运算符的正确方法,还是有其他方法。谢谢你的回答。

我见过这个post,但它没有说明如何在like子句中的or上使用非字符串。

2 个答案:

答案 0 :(得分:3)

这里有另一种选择:

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}%")

我认为这是一种懒惰的方式,但它应该有用。

答案 1 :(得分:1)

ilike仅适用于Strings(文字)。您不能在其他数据类型上使用它。使用不敏感(与字符串相关)没有意义。这不是Grails或Hibernate的限制,而是SQL的功能。

请改用like运算符。

之前已经问过这个问题,has been answered(从休眠的角度来看)。