在grails 3数据服务中查询与JPA QL的向后关联,对象上是否缺少MethodException executeQuery?

在grails 3数据服务中查询与JPA QL的向后关联,对象上是否缺少MethodException executeQuery?,jpa,gorm,jpql,grails3,grails-3.3,Jpa,Gorm,Jpql,Grails3,Grails 3.3,在收集作者及其书籍的数据库中,我们通过作者将书籍添加为书籍实例 但是,作者可能拥有尚未添加到数据库的书籍。这就是为什么我们有一个外部的理智计数器,告诉我们一个作者实际出版了多少本书。如果编号No.Booe等于数据库中的书籍实例,那么我们认为我们有一个作者完整的书目。 在SQL中,用于获取其书目完整的所有作者的SQL查询将如下所示: select author.id, count(*) from book inner join author on book.author_id=author.id

在收集作者及其书籍的数据库中,我们通过
作者
将书籍添加为
书籍
实例

但是,
作者
可能拥有尚未添加到数据库的书籍。这就是为什么我们有一个外部的理智计数器,告诉我们一个
作者实际出版了多少本书。如果<代码>编号No.Booe<代码>等于数据库中的<代码>书籍<代码>实例,那么我们认为我们有一个<代码>作者<代码>完整的书目。

在SQL中,用于获取其书目完整的所有
作者的SQL查询将如下所示:

select author.id, count(*)
from book inner join author on book.author_id=author.id
group by author.number_Of_Known_Books, author.id
having count(*) = author.number_Of_Known_Books
这里的困难在于连接点的方向相反,而普通示例通常显示如何创建查询以获取与
作者
连接的
书籍
,而不是相反

我在stackoverflow中找到了一些文章,解释了如何在普通JPQL中执行类似的操作(减去组,因为…有复杂性),但是在GORM 6.1+中数据服务中的
@Query
注释所期望的DSL中执行此操作,我得到了一个异常,发生在AST生成代码的地下城中,表示在
java.lang.Object
上找不到方法
executeQuery
。这是一个合理的抱怨,但我不知道为什么会这样。不幸的是,无法单步调试此代码

这是我的数据服务:

import grails.gorm.services.Query
import grails.gorm.services.Service


@Service
abstract class AuthorService {

    @Query("""
            select a.*, count(a.id)
            from ${Book b} join ${b.author} a
            group by a.numberOfKnownBooks, a.id
            having count(*) = a.numberOfKnownBooks
""")
    abstract List<Author> retrieveCompleteAuthors()
}
import grails.gorm.services.Query
导入grails.gorm.services.Service
@服务
抽象类AuthorService{
@查询(“”)
选择一个*号,计数(a.id)
从${Book b}加入${b.author}a
a.numberOfKnownBooks,a.id分组
拥有count(*)=a.numberOfKnownBooks
""")
摘要列表检索CompleteAuthors()
}
更新:按照jeff的指示删除了@GrailsCompileStatic和@Transactional的无用注释

完整解决方案,带有正确的JPQL查询:

@Service(Author)
abstract class AuthorService {
    @Query("""
        select auth from ${Author auth}  where auth.id in (
            select a.id
            from ${Book b} join ${b.author} a
            group by a.numberOfKnownBooks, a.id
            having count(*) = a.numberOfKnownBooks
        ) 
""")
    abstract List<Author> retrieveCompleteAuthors()
}
@服务(作者)
抽象类AuthorService{
@查询(“”)
从${Author auth}中选择auth,其中auth.id位于(
选择a.id
从${Book b}加入${b.author}a
a.numberOfKnownBooks,a.id分组
拥有count(*)=a.numberOfKnownBooks
) 
""")
摘要列表检索CompleteAuthors()
}

我希望这不是您真正想要的HQL,但这是一个单独的问题。如果你这样做,你问的错误应该会消失

import grails.gorm.services.Query
import grails.gorm.services.Service

@Service(Author)
abstract class AuthorService {

    @Query('''
            select a.*, count(a.id)
            from ${Book b} join ${b.author} a
            group by a.numberOfKnownBooks, a.id
            having count(*) = a.numberOfKnownBooks
    ''')
    abstract List<Author> retrieveCompleteAuthors()
}
import grails.gorm.services.Query
导入grails.gorm.services.Service
@服务(作者)
抽象类AuthorService{
@查询(“”)
选择一个*号,计数(a.id)
从${Book b}加入${b.author}a
a.numberOfKnownBooks,a.id分组
拥有count(*)=a.numberOfKnownBooks
''')
摘要列表检索CompleteAuthors()
}

在这种特殊情况下,
@Transactional
@GrailsCompileStatic
是多余的,因此可以删除它们。真正的问题是
@Service(Author)
vs
@Service
。我的查询仍然失败,但你解决了我自己无法解决的问题:让Gorm执行我的查询。为此,我要归功于你。当我得到正确的查询时,我将更新查询。将@Service替换为@Service(Author)成功了。如果将
替换为
,查询至少会执行。不清楚它是否正确,但至少会生效。
的问题在于”
是一个带插值的Groovy字符串,字符串中有
${Book b}
${b.author}
之类的表达式。