Поиск записей с разделенными запятыми значениями, которые содержат любой элемент из данного списка - PullRequest
1 голос
/ 12 апреля 2011

У меня есть класс домена 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», если это поможет.

Спасибо

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Надеюсь, у вас есть веская причина для такой денормализации - в противном случае было бы лучше сохранить список в дочернюю таблицу.

В противном случае запрос будет сложным.Нравится:

  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"
      }
    }
  }
0 голосов
/ 12 апреля 2011

В MySQL есть тип данных SET и функция FIND_IN_SET, но я никогда не использовал это с Grails.Некоторые базы данных имеют поддержку стандартного типа данных ARRAY SQL2003 для хранения массивов в поле.Их можно отобразить с помощью пользовательских типов гибернации (которые поддерживаются в 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 делаетзапросы немного более эффективны, чем подобные запросы, если вы заботитесь о производительности и имеете реальное требование сделать денормализацию.

...