2016-01-18 3 views
4

У меня есть класс ДоменаGrails Горм 'где' запрос с 'ниже()' и 'в' оператора

class Hashtag { 
    String tag 
} 

Почему

Hashtag.where { lower(tag) == "#london" }.list() 

работает нормально, но

Hashtag.where { lower(tag) in [ "#london", "#paris" ] }.list() 

Результаты в

org.springframework.dao.InvalidDataAccessResourceUsageException: Unsupported function [lower] defined in query for property [hashtag] with type [class java.lang.String]

Как правильно написать такой запрос?

Спасибо!

+0

У меня есть аналогичный код, который использует метод lower(), и заметил, что он работает непоследовательно. Когда это не сработает, обходным путем является повторное развертывание военного файла в экземпляр tomcat. Вместо этого я буду использовать ваш метод createCriteria() ниже, чтобы убедиться, что он работает более последовательно. – Joe

+0

Не могу сказать о согласованности. Я использую метод lower(), но я не слежу за тем, как он работает. – Igor

ответ

1

Не могу ответить, почему использование lower() с in() не работает. Я читал source, но я не знаю АСТ достаточно хорошо, чтобы понять это.

Но для решения вашей проблемы вы можете использовать derived property для выполнения lower().

class Hashtag { 
    String tag 
    String loweredTag 

    static mapping { 
     loweredTag formula: 'lower(tag)' 
    } 
} 

Затем вы можете использовать полученное имущество в запросе где:

Hashtag.where { loweredTag in [ "#london", "#paris" ] }.list() 
+0

Это работает , благодаря! – Igor

0

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

Hashtag.where { lower(tag).of{} in [ "#london", "#paris" ] }.list() 

Пожалуйста, попробуйте и дайте мне знать, если он не работает.

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

+0

К сожалению, это не работает, в результате получается '' 'groovy.lang.MissingMethodException: Нет сигнатуры метода: grails.gorm.DetachedCriteria.lower() применим для типов аргументов: (grails.gorm.DetachedCriteria) значения: [grails .gorm.DetachedCriteria @ 3a76c384] Возможные решения: toSet() или (groovy.lang.Closure), order (java.lang.String), count(), get(), list() '' ' – Igor

1

Отвечая на мой собственный вопрос, я нашел альтернативный способ сделать сравнение без учета регистра - использование критериев. Преимущество этого метода состоит в том, что значения в cities также могут быть смешанными случаями.

def cities = ["#LONdon", "#PAris"] 
Hashtag.createCriteria().list { 
    or { 
     cities.each { eq("tag", it, [ignoreCase: true]) 
    } 
}