2017-11-30 17 views
2

私は2つのテーブル/エンティティを持っています。すべて正常に動作します(ゲッターとセッターは省略されています)。フィールドがbook_idとCATEGORY_ID含ま結合表と呼ばれるbook_categoryで期待通りJPAのManyToManyクエリ

@Entity 
    public class Book() { 
    @Id; 
    int id; 
    @ManyToMany 
    List<Category> categories; 
} 

@Entity 
public class Category { 
    @Id 
    int id; 
    @ManyToMany 
    List<Book> books; 
} 

JPA/Hibernateはデータベース構造を作成します。

カテゴリはあらかじめ作成されているので、すべてが本を持っているわけではありません。 私はそれらに書籍を持っている別のカテゴリを照会したいと思います。

次のSQLクエリはそれをしない:

SELECT DISTINCT <things> FROM book_category JOIN category ON category.id = book_category.category_id 

しかし、どのように私はリポジトリからのカテゴリのリストを得ることができますか?あなたがそれらに割り当てられた本を持っているすべてのカテゴリをしたい場合は、私はあなただけの本のコレクションのサイズをチェックCategoryエンティティのクエリが必要だと思う

答えて

2

:ジャンクションテーブルを照会

select c from Category where size(c.books) > 0 

場合でも、直接可能である、例えばネイティブクエリを介して、これは良いJPAのプラクティスとは考えられません。むしろ、すでに持っている2対多エンティティは、必要なクエリを実行できるようにする必要があります。

+0

だから私は、カテゴリ・リポジトリ '一覧 findDistinctByBookIsGreaterThan(I int型)'でこれをしようとしたが、それは私に 'NoSuchElementException' – jared

+0

を与える直接JPQLクエリではないオプションですか? –

+0

@ jared私の答えの名前付きメソッド構文は正確ではありません。しかし、必要に応じていつでもJPQLを直接使用することができます。 –

0

私が理解したように、あなたのカテゴリーのJPAリポジトリが必要です。これによりリポジトリが作成され、それを使って書籍を持つカテゴリを取得することができます。あなたは本のIDを取得する必要があります。 JPAは非常に柔軟性がありますので、これは正確には望んでいないかもしれませんが、自分で試してみてください。

public interface CategoryRepository extends JpaRepository <Category, Integer> 
{ 
    List<Category> findByBookId(Integer book); 
} 

EDIT:いいです、それは長い一日であり、私は疲れています。あなたがその逆を試みるとどうですか?

public interface BookRepository extends JpaRepository <Book, Integer> 
{ 
    List<Book> findAllByCategoryId(Integer category); 
} 

次に、nullであるかどうかを確認します。

+0

しかし、私はどの本であろうと、その中に本があるすべてのカテゴリが欲しいです。 – jared

+0

このコードでは、ブックが含まれているすべてのカテゴリが表示されます。本がなければ本は見つからない。 「リスト categroyList = categoryRepository.findByBookId(bookId)」 次に、あなただけのcategoryListが空の場合、それはモデルでそれを示してはならないかを確認してください。できるなら、あなたのコントローラを投稿して、あなたが何を正確にしているかを見ることができます。それはあなたが探しているものですよね?カテゴリが空の場合は表示されませんか?その中に本があれば、それは – Sibuscus

+0

私の編集を参照してください、私はまっすぐに考えることができる明日まで終了するつもりです。 – Sibuscus

関連する問題