我有一个域类计划,其属性'days'包含逗号分隔值,如'2,5,6,8,9'。
Class Schedule {
String days
...
}
Schedule schedule1 = new Schedule(days :'2,5,6,8,9')
schedule1.save()
Schedule schedule2 = new Schedule(days :'1,5,9,13')
schedule2.save()
我需要从给定列表中获取任何日期的时间表列表[2,8,11]。
Output: [schedule1]
如何编写条件查询或HQL。我们可以加前缀&如果有帮助的话,请用',2,5,6,8,9'这样的逗号后缀。
谢谢,
答案 0 :(得分:2)
希望你有充分的理由进行这种非规范化 - 否则最好将列表保存到子表中。
否则,查询会很复杂。像:
def days = [2,8,11]
// note to check for empty days
Schedule.withCriteria {
days.each { day ->
or {
like('username', "$day,%") // starts with "$day"
like('username', "%,$day,%")
like('username', "%,$day") // ends with "$day"
}
}
}
答案 1 :(得分:0)
在MySQL中有一个SET数据类型和FIND_IN_SET函数,但我从来没有用过Grails。某些数据库支持标准SQL2003 ARRAY数据类型,用于在字段中存储数组。可以使用hibernate usertypes(Grails支持)来映射它们。
如果您使用的是MySQL,则FIND_IN_SET查询应该与Criteria API sqlRestriction一起使用: http://grails.org/doc/latest/api/grails/orm/HibernateCriteriaBuilder.html#sqlRestriction(java.lang.String) 如果您关心性能并且真正需要进行非规范化,那么使用SET + FIND_IN_SET可以使查询比类似查询更有效。