【问题标题】:How to do polymorphic queries with executeQuery() in grails?如何在 grails 中使用 executeQuery() 进行多态查询?
【发布时间】:2011-05-02 18:01:30
【问题描述】:

为什么这个多态查询不起作用?

    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)

更新2

这个问题让我很困惑。现在我不想再花时间在上面了。这就是我最终要做的事情:

    def typeClass = Super.class.name

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

    return UserMedia.executeQuery(hql)

真的很奇怪,无论我在尝试传递classclass.name 时做了什么,我总是会收到错误消息。有和没有多行 groovy 字符串。

【问题讨论】:

    标签: hibernate grails groovy grails-orm


    【解决方案1】:

    试试:

    [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])
        }
    }
    

    【讨论】:

    • 还是同样的错误。认为它与命名的属性函数有关。
    • 我添加了一个代码示例,以确保我们以相同的方式构建类。
    • 我一有时间就去看看。奇怪的是它对我不起作用。但是,您的解决方案是否仍然适用于多行 GString? (例如 """ gstring """)
    • 在 grails 文档中发现:Groovy 多行字符串不适用于 HQL 查询
    • 这不是很直观,但Domain.executeQuery() 接受多行 gstrings 没有任何抱怨。 Domain.findAll() 没有;如果我没记错的话,您可以使用单行字符串,也可以在多行 gstring 的每行末尾添加反斜杠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多