2016-04-07 10 views
1

1対多の関係を持つ2つのエンティティBookBook_Categoryを作成しました。 BookCategoryRepository.findAll()を発行したとき、私は休止状態が 'INNER JOIN'クエリを使用すると予想しました。しかし、それはちょうどBook_Categoryからデータを取るためのクエリを発行しました。なぜspringデータjpaがJOINクエリを発行していないのですか?

私には何が欠けていますか?休止状態にJOINクエリを発行するにはどうすればよいですか?

Book.java

@Entity 
public class Book { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    private String name; 

    @ManyToOne 
    @JoinColumn(name = "book_category_id") 
    private BookCategory bookCategory; 
} 

BookCategory.java

@Entity 
@Table(name = "book_category") 
public class BookCategory { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    private String name; 
    @OneToMany(mappedBy = "bookCategory", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private Set<Book> books; 
} 

BookCategoryRepository.java

public interface BookCategoryRepository extends JpaRepository<BookCategory, Integer> { 
} 


bookCategoryRepository.findAll() 
+0

参加はエンティティ上で行われているので発生します。エンティティのBookCategoryにはBooksのセットも含まれていますので、findAll()を実行すると書籍のセットを受け取る必要があります。あなたがここで達成しようとしていることは何ですか?あなたが本当にクエリでJOINを参照する必要がある場合は、@ queryを書くことができます。 –

+0

HibernateはBook_categoryからselect *だけを出しています。 book_Category inner join Book bからselect *を発行すると思います。私はすでにFetchTypeをeagerに設定しています。だから私は@Queryを使いたくない。 – Manoj

+0

@GrinishNepal '@ query'もその場合は動作しません。 – PSyLoCKe

答えて

4

Hibernateは、子コレクションをretrievするために、デフォルトでは2番目のクエリを使用しています。これの1つの理由は、適切な制限クエリです。そうでなければ、少なくとも1つに1つ以上の子がある場合、結果セットには1の側のエンティティよりも多くの行が存在します。

Spring Data Jpaリポジトリで無視されるhibernateでこの動作を変更するアノテーションが存在します。注釈は@Fetch(FetchMode.JOIN)です。この現象が本当に必要な場合は、How does the FetchMode work in Spring Data JPAと考えることができます。

関連する問題