Как сделать полиморфные запросы с executeQuery () в Grails? - PullRequest
0 голосов
/ 02 мая 2011

Почему этот полиморфный запрос не работает?

    String hql = """
                   FROM User u
                   WHERE
                   u.type.class = :typeClass
                """

    return User.executeQuery(hql, [typeClass:Super])

все, что я получаю, это следующее исключение:

Stacktrace follows:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.Integer
....

Обновление Ошибка появляется только при попытке добавить класс в качестве именованного аргумента,Например, я не получаю сообщение об ошибке с этим кодом:

    String hql = """
                   FROM User u
                   WHERE
                   u.type.class = Super
                """

    return User.executeQuery(hql)

Update2

Эта проблема сбила меня с толку.И теперь я не хочу тратить на это больше времени.Вот что я закончил делать:

    def typeClass = Super.class.name

    String hql = """
                   FROM User u
                   WHERE
                   u.type.class = $typeClass
                """

    return UserMedia.executeQuery(hql)

Действительно странно, независимо от того, что я делал, когда пытался передать class или class.name, я всегда получал ошибку.С и без многострочного шпунта.

1 Ответ

2 голосов
/ 02 мая 2011

Попробуйте:

[typeClass: Super.class.name]

Редактировать: вот упрощенная версия кода, который работает для меня.

class Food {
    // ...
}

class CatFood extends Food {
    // ...
}

class DogFood extends Food {
    // ...
}

class Animal {
    static belongsTo = [food: Food] // This example is a little contrived...
}

class AnimalService {
    def usedCatFoods() {
        Animal.executeQuery("select a.food from Animal a where a.food.class = :foodClass", [foodClass: CatFood.class.name])
    }
}
...