Названные параметры 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%"]