Grails использует унаследованное свойство в именованном запросе

Я хочу использовать унаследованное свойство в именованном запросе производного экземпляра, чтобы я мог предоставить пользовательский вид результатов. Я получаю сообщение об ошибке.

package com.example

class Ticket {
    // User is defined elsewhere
    static belongsTo = [user : User]
    String idNumber
}

class SeasonTicket extends Ticket {

    // some custom properties go here

    static namedQueries = {
        locateOrderedSeasonTicketsByUser { user ->
            // all derived instances are in the same table, hence return only the correct derived instances
            eq("class", "com.example.SeasonTicket")

            // return a match on user
            user {
                idEq(user.id)
            }

            // implement custom order
            order "customProperty"
        }
    } << Ticket.namedQueries
}

Последняя строка позволяет использовать любые унаследованные именованные запросы, определенные в базовом классе.

Я получаю следующую ошибку при запуске интеграционного теста, который вызывает:

SeasonTicket.locateOrderedSeasonTicketsByUser(someUserInstance)

Сигнатура метода: com.example.User.call() не применима для типов аргументов: (com.example.SeasonTicket$__clinit__closure2_closure3_closure4) значений: [com.example.SeasonTicket$__clinit__closure2_closure3_closure4@31ee7d7a] Возможные решения: wait(), last (), save(), any(), getAll(), ожидание (долгое)

Интеграционный тест был моей первой попыткой провести простой тест:

void "SeasonTicket.locateOrderedSeasonTicketsByUser finds an object"() {
    given:
    def seasonTicket = new SeasonTicket()
    def user = new User()       
    user.addToSeasonTickets(seasonTicket)
    user.save(flush: true, failOnError: true)

    expect: "we can find one season ticket"
    SeasonTicket.locateOrderedSeasonTicketsByUser(user).list().size() == 1
}

Похоже, пользовательское поле в базовом классе не распознается. Что я делаю неправильно, пожалуйста?


person John    schedule 28.01.2015    source источник
comment
Попробуйте переименовать параметр запроса... Похоже на конфликт между параметром user вашего запроса и свойством user класса Ticket.   -  person aiolos    schedule 28.01.2015
comment
Точно, спасибо - я думал, что пользователь в запросе будет обрабатываться так, как если бы он был переменной-членом (т.е. с неявным «это»), и поэтому не было бы конфликта с локальным параметром, переданным в запрос. Пожалуйста, не могли бы вы добавить в качестве ответа, чтобы я мог принять?   -  person John    schedule 28.01.2015


Ответы (1)


У вас есть конфликт имен между вашим локальным параметром user и вашим свойством класса 'user'.

Эта часть ваших критериев

user {
    idEq(user.id)
}

попытается вызвать метод для вашего локального параметра user, который не существует, вместо того, чтобы строить ваш запрос, используя свойство user Ticket.

Переименуйте параметр namedQuery в locateOrderedSeasonTicketsByUser.

person aiolos    schedule 28.01.2015