如何在grails中使用ilike和Integer

时间:2014-04-07 12:37:25

标签: grails groovy

我使用EasyGrid插件,必须找到整数字段的值,如'%001%'

initialCriteria {
    ilike('id', "%"+params.id+"%")
}

但是ilike并没有与Integer合作。怎么做?

我试着这样做:

    initialCriteria {
        ilike('id'.toString(), "%"+params.id+"%")
    }

    initialCriteria {
        ilike('str(id)', "%"+params.id+"%")
    }

但它不起作用。

5 个答案:

答案 0 :(得分:4)

如果id是数据库中的整数,那么ilike实际上没有多大意义,并且可能有更好的方法来做你想做的事情(比如添加一个类型字段)或域名对象的东西,并按类型过滤)

但是,你应该可以做这样的事情(未经测试):

initialCriteria {
    sqlRestriction "cast( id AS char( 256 ) ) like '%001%'"
}

答案 1 :(得分:0)

你可以这样做:

String paddedId = params.id.toString().padLeft(3,'0')

initialCriteria {
    ilike('id', "%$paddedId%")
}

答案 2 :(得分:0)

tim_yates提供的带有sqlRestriction的解决方案适用于easygrid的1.5.0版本。 与1.4.x的主要区别之一是gorm数据源不再使用DetachedCriteria,而是Criteria - 它直接映射到Hibernate的Criteria API。

所以你可以在最后一个版本上试试。 (请记住,升级可能会破坏现有的网格。还有许多其他更改)

另一个小小的观察是'initialCriteria'不适合做那样的事情。 (这没有错,但是有一个'globalFilterClosure'属性用于应用列独立过滤器)

答案 3 :(得分:0)

我混合了@tim_yates和我发布的代码:

String paddedId = params.id.toString().padLeft(3,'0')

def crit = Book.withCriteria {
    sqlRestriction "lpad(cast( id AS char( 256 ) ), 3, '0') like '%${paddedId}%'"
}

我已尝试使用h2内存数据库并且它可以正常工作,但我不确定两件事:

  • 的真正用处 所有数据库引擎的
  • lpad语法一致性

YMMV

答案 4 :(得分:0)

如果您在用户搜索任何文字字符 错误(例如 12dfdsf )作为您的可搜索ID时从文本框中搜索,则以下条件无效。它会为您提供例外

initialCriteria {
    ilike('id', "%"+params.id+"%")
}

为了更好地使用,您可以使用以下标准

initialCriteria {
   sqlRestriction "id like '%${params?.id}%'"
}