搜索具有逗号分隔值的记录,其中包含给定列表中的任何元素

时间:2011-04-12 04:43:04

标签: grails hql hibernate-criteria

我有一个域类计划,其属性'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'这样的逗号后缀。

谢谢,

2 个答案:

答案 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可以使查询比类似查询更有效。