1

著者とその書籍を収集するデータベースに、書籍をインスタンスAuthorとして追加します。Book

ただし、Authorデータベースにまだ追加されていない書籍がある場合があります。Authorこれが、実際に出版された本の数を示す、外部のサニティ カウンターがある理由です。がデータベース内のインスタンスnumberOfKnownBooksの数と等しい場合、の完全な参考文献があると見なされます。BookAuthor

データ・モデル

Authors参考文献が完全なすべてを取得するための 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

ここでの問題は、 join が反対方向を指していることです。通常の例では、通常、 join を取得するためのクエリの作成方法が示されていますが、その逆でBooksAuthorsありません。

単純なJPQLでこのようなことを行う方法を説明しているいくつかの記事をstackoverflowで見つけました(グループを差し引いて...複雑化する)here@Queryが、GORM 6.1+のデータサービスの注釈によって期待されるDSLでこれを行うと、私はAST によって生成されたコードのダンジョンで発生する例外を取得し、 でメソッドexecuteQueryが見つからないことを示しますjava.lang.Object。これは合理的な苦情ですが、なぜそれが起こっているのかわかりません。残念ながら、このコードをステップ デバッグする方法はありません。

これは私のデータ サービスです。

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()
}

UPDATE : jeff の指示に従って、役に立たない注釈 @GrailsCompileStatic および @Transactional を削除しました

FULL SOLUTION、適切な 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()
}
4

1 に答える 1