Grails:选择具有给定id(子查询)和Where Query的Child的Parent of Child

时间:2012-09-09 21:24:01

标签: hibernate grails subquery gorm

使用grails 2.1.0和默认的H2数据库。我有以下域名:

class Project {
    static hasMany = [tasks: Task]
}

class Task {
    Date dateCreated
    static belongsTo = [project: Project]
}

我有一个任务ID,想要使用全新的gorm where queries从任务(给定id)项目中获取所有任务。这是我的尝试:

def tasks = Task.where {
    project == property('project').of { id == firstTask.id }
}.list()

(firstTask.id是给定的任务ID,代码是从测试中剪切的)

令人不快的意外结果是:

IllegalArgumentException occurred calling getter of so.q.grom.subqueries.Project.id
org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of so.q.grom.subqueries.Project.id
    at grails.gorm.DetachedCriteria.list_closure2(DetachedCriteria.groovy:639)
    at grails.gorm.DetachedCriteria.withPopulatedQuery_closure9(DetachedCriteria.groovy:890)
    at org.grails.datastore.gorm.GormStaticApi.withDatastoreSession_closure18(GormStaticApi.groovy:555)
    at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:301)
    at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:34)
    at org.grails.datastore.gorm.GormStaticApi.withDatastoreSession(GormStaticApi.groovy:554)
    at grails.gorm.DetachedCriteria.withPopulatedQuery(DetachedCriteria.groovy:873)
    at grails.gorm.DetachedCriteria.list(DetachedCriteria.groovy:638)
    at grails.gorm.DetachedCriteria.list(DetachedCriteria.groovy:637)
    at GormSubqueriesSpec.should get tasks from the same project(GormSubqueriesSpec.groovy:32)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
    ... 10 more

为什么!? :(如何与...不同:

def tasks = Task.findAll() {
    dateCreated < property('dateCreated').of { id == secondTask.id }
}

为了澄清,使用HQL,我想要的是:

def tasks = Task.findAll(
        'from Task task where task.project = (select t.project from Task t where t.id = :taskId)',
        [taskId: firstTask.id]
)

但我想在“查询地点”。

为了您的方便(我是精确的),带有查询的域和测试的Grails项目是available here

2 个答案:

答案 0 :(得分:1)

你应该提出这个问题。以下示例编译并运行:

def tasks = Task.where {
    project == property('project')
}.list()

但添加子查询会导致问题。至少,错误消息应该提供更多信息。但我不明白为什么它在理论上不起作用。

无论如何,与此同时,HQL可能是你最好的选择。

答案 1 :(得分:0)

通过动态查找器可能有更简单的方法:

Task.findAllByProject( thisTask.project )

我不知道有关您的项目的详细信息,但您可以将此方法添加到域类任务:

public Collection<Task> findAllTasksinPoject() {
    return Task.findAllByProject( project )
}

你可以在Task类的每个实例上调用它。