Как сделать запрос с использованием оператора like над коллекцией строк в GORM - PullRequest
3 голосов
/ 02 декабря 2011

Предположим, класс домена называется Пользователь . Пользовательский класс выглядит так:

class User {
     List<String> values
}

Коллекция значений содержит строки типа "http://example.com/x"," http://google.com/y", "http://google.com/z" и т. Д. ...

Допустим, мы хотим создать запрос, который получит всех пользователей, у которых есть определенная строка в коллекции значения (например, "google.com"). Примерно так:

def criteria = User.createCriteria()
def results = criteria.listDistinct () {
  and {
    user.values.each {  like('someField', '%${it}%') }
  }
}

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 03 декабря 2011

Я нашел ответ экспериментально. Решение:

def criteria = User.createCriteria()
def results = criteria.listDistinct () {
  and {
    user.values.each {  like('someField', '%'+it+'%') }
  }
}
0 голосов
/ 13 июня 2014

После долгих попыток и исследований я обнаружил, что это будет работать с Grails 2.4.0, я не знаю о старых версиях.

Cat.withCriteria {
    createAlias('nicknames', 'n') 
    ilike 'n.elements', '%kitty%'
}

Хитрость заключается в том, чтобы использовать 'n. элементы

0 голосов
/ 02 декабря 2011

Я не уверен, что вы делаете с вашим предложенным ответом.Я никогда не видел такого использования в запросе критериев прежде.

Этот вопрос задавался много раз прежде, но никогда не давал ответа.Проблема в том, что вы запрашиваете ассоциацию String, которая не является классом домена.Если вы создадите свой собственный класс домена String, например, ondrej.String {String strValue}, вы сможете:

User.withCriteria {

 values { ilike("strValue", "...") }

}

Проблема в том, что у вас нет доступа к значению объекта String.Значение класса String называется значением, но это массив символов, поэтому я не верю, что сработает следующее:

User.withCriteria {

 values { ilike("value", "...") }

}

Вы можете попробовать использовать:

User.withCriteria {

 values { ilike("toString", "...") }

}

или что-то еще вместо toString ... У меня нет возможности проверить это прямо сейчас.

Надеюсь, это поможет

...