1

我有一个域类 Schedule ,其属性 '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,'。

谢谢,

4

2 回答 2

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"
      }
    }
  }
于 2011-04-12T08:26:18.730 回答
0

在 MySQL 中有一个 SET 数据类型和 FIND_IN_SET 函数,但我从未在 Grails 中使用过它。一些数据库支持标准 SQL2003 ARRAY 数据类型,用于在字段中存储数组。可以使用休眠用户类型(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如果您关心性能并且确实需要进行非规范化,则使查询比类似查询更有效。

于 2011-04-12T10:17:58.883 回答