著者とその書籍を収集するデータベースに、書籍をインスタンスAuthor
として追加します。Book
ただし、Author
データベースにまだ追加されていない書籍がある場合があります。Author
これが、実際に出版された本の数を示す、外部のサニティ カウンターがある理由です。がデータベース内のインスタンスnumberOfKnownBooks
の数と等しい場合、の完全な参考文献があると見なされます。Book
Author
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 を取得するためのクエリの作成方法が示されていますが、その逆でBooks
はAuthors
ありません。
単純な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()
}