我目前正致力于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
上使用非字符串。
答案 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(从休眠的角度来看)。