Названные параметры Grails HQL не работают

Платформа Grails Версия: 3.0.7 | Groovy Версия: 2.4.4 | Версия JVM: 1.8.0_51

Кажется, я не могу использовать именованные параметры в HQL-запросе Grails. Следующие работы (внутри класса обслуживания Grails).

    def query = 'from Event event ' +
                'where event.eventName like ? ' +
                'or event.address.town like ?'
    def results = Event.executeQuery(query, ["%London%", "%London%"], [offset: 5, max: 5])

Однако следующее не работает:

    def query = 'from Event event ' +
                'where event.eventName like :searchEventName ' +
                'or event.address.town like :searchTownName'
    def results = Event.executeQuery(query, [searchEventName, "%London%", searchTownName, "%London%"], [offset: 5, max: 5])

Показанная ошибка:

Class
groovy.lang.MissingPropertyException
Message
null
Caused by
No such property: searchEventName for class: com.mchq.event.SearchService

Идя против того, что я считаю правильным, я тогда объявляю свойства...

    def searchEventName, searchTownName
    def query = 'from Event event ' +
                'where event.eventName like :searchEventName ' +
                'or event.address.town like :searchTownName'
    def results = Event.executeQuery(query, [searchEventName, "%London%", searchTownName, "%London%"], [offset: 5, max: 5])

и сообщение об ошибке:

Class
java.lang.IllegalArgumentException
Message
null
Caused by
No positional parameters in query: from Event event where event.eventName like :searchEventName or event.address.town like :searchTownName

В качестве одного из последних тестов я попробую следующее, удалив объявления переменных и список именованных параметров.

    def query = 'from Event event ' +
                'where event.eventName like :searchEventName ' +
                'or event.address.town like :searchTownName'
    def results = Event.executeQuery(query, [offset: 5, max: 5])

И совершенно правильно, сообщение возвращается как:

Class
org.hibernate.QueryException
Message
null
Caused by
Not all named parameters have been set: [searchEventName, searchTownName] [from Event event where event.eventName like :searchEventName or event.address.town like :searchTownName]

Кто-нибудь может сказать мне ошибку, которую я делаю? Кажется, что позиционные параметры работают, только находят, но передают карту именованных параметров, вызывая эту странную ошибку

2 ответа

Решение

Вы делаете большую опечатку, так как в случае именованного запроса мы передаем карту, а не список. Смотрите код ниже:

def query = 'from Event event ' +
                'where event.eventName like :searchEventName ' +
                'or event.address.town like :searchTownName'
    def results = Event.executeQuery(query, [searchEventName: "%London%", searchTownName: "%London%"], [offset: 5, max: 5])

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

То, как вы передали параметры, неверно. [searchEventName, "%London%", searchTownName, "%London%"] Список в заводной.

Вы должны указать их как карту. Карта определяется как [key1:value1, key2:value2].

Таким образом, правильный способ передачи параметров будет [searchEventName: "%London%", searchTownName: "%London%"]

Другие вопросы по тегам