在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}
之类的表达式。