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(), последно (), save(), any(), getAll(), wait(long)

Интеграционният тест беше първият ми опит за прост тест:

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