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

У меня есть расписание класса домена со свойством «дни», содержащим значения, разделенные запятыми, например «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», если это поможет.

Спасибо,


person Amit Jain    schedule 12.04.2011    source источник


Ответы (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"
      }
    }
  }
person Victor Sergienko    schedule 12.04.2011
comment
Спасибо Виктор! Я упростил его, изменив формат дней в расписании на ,2,5,6,8,9, а затем используя только одно подобное выражение, например, подобное ('days', %, $day, %) - person Amit Jain; 14.04.2011

В MySQL есть тип данных SET и функция FIND_IN_SET, но я никогда не использовал это с Grails. Некоторые базы данных поддерживают стандартный тип данных SQL2003 ARRAY для хранения массивов в поле. Их можно сопоставить, используя пользовательские типы hibernate (которые поддерживаются в Grails).

Если вы используете MySQL, запрос FIND_IN_SET должен работать с sqlRestriction Criteria API: http://grails.org/doc/latest/api/grails/orm/HibernateCriteriaBuilder.html#sqlRestriction(java.lang.String) Использование SET+FIND_IN_SET делает запросы немного более эффективен, чем подобные запросы, если вы заботитесь о производительности и действительно нуждаетесь в денормализации.

person Lari Hotari    schedule 12.04.2011
comment
Или кластеризация таблиц Oracle: frontiernet.net/~rhode/cluster.html. Или что. Если мы действительно заботимся об эффективности, мы могли бы реализовать Set для любой СУБД с битовым полем или битовым полем, эмулирующим строку. - person Victor Sergienko; 12.04.2011
comment
Большое спасибо, Флер! Это выглядит здорово, я собираюсь попробовать это - person Amit Jain; 14.04.2011