2017-01-03 10 views
0

私は(DDLも/役割を果たしていない場合があり、コードから生成されます、簡潔のためにgetterとsetterアウト)以下のJPAマッピングを持っている:Spring Data JPAは@Fetchアノテーションを無視しますか?

費用

@Entity 
public class Expense { 

@Id 
@GeneratedValue 
private Long id; 


private String name; 
private Long amount; 
private Boolean monthly; 

@OneToOne 
@JoinColumn(name = "category") 
@Fetch(FetchMode.JOIN) 
private Category category; 

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
@JsonInclude(JsonInclude.Include.NON_EMPTY) 
private List<Label> labels = new ArrayList<>(); 
//constructor, getters and setters... 
} 

カテゴリー

@Entity 
public class Category { 

@Id 
private String name; 

//constructor, getters and setters... 
} 

ラベル

JpaRepository

@Entity 
public class Label { 

@Id 
private String name; 
//constructor, getters and setters... 

} 

使い方だから私はこのようになりますJpaRepository使用しています:私はJpaRepositoryのデフォルトのfindAll()メソッドを使用する場合は、私が取得

public interface ExpensesRepository extends JpaRepository<Expense, Long> { 

    @Query("SELECT e FROM Expense e LEFT JOIN FETCH e.category") 
    List<Expense> findAllExpensesExploded(); 
} 

をa n + 1選択問題

2017-01-03 19:35:22.665 DEBUG 26040 --- [nio-8080-exec-1] org.hibernate.SQL      : select expense0_.id as id1_1_, expense0_.amount as amount2_1_, expense0_.category_name as category5_1_, expense0_.monthly as monthly3_1_, expense0_.name as name4_1_ from expense expense0_ 
2017-01-03 19:35:22.673 DEBUG 26040 --- [nio-8080-exec-1] org.hibernate.SQL      : select category0_.name as name1_0_0_ from category category0_ where category0_.name=? 
2017-01-03 19:35:22.674 TRACE 26040 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder  : binding parameter [1] as [VARCHAR] - [Rent] 
2017-01-03 19:35:22.682 DEBUG 26040 --- [nio-8080-exec-1] org.hibernate.SQL      : select category0_.name as name1_0_0_ from category category0_ where category0_.name=? 
2017-01-03 19:35:22.683 TRACE 26040 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder  : binding parameter [1] as [VARCHAR] - [Insurance] 

2017-01-03 19:35:22.691 DEBUG 26040 --- [nio-8080-exec-1] org.hibernate.SQL      : select expense0_.id as id1_1_0_, category1_.name as name1_0_1_, expense0_.amount as amount2_1_0_, expense0_.category_name as category5_1_0_, expense0_.monthly as monthly3_1_0_, expense0_.name as name4_1_0_ from expense expense0_ left outer join category category1_ on expense0_.category_name=category1_.name 

がためだった私の期待は両方のfindAll()findAllExpensesExploded()すべき:私は私自身のfindAllExpensesExploded()メソッドを使用する場合

はしかし、私は、単一のSQLクエリを取得します単一のSQLクエリで実行されます。

  • 私は
  • それを正しく構築されているようにしかし、なぜにfindAll()は与えられたマッピング・アノテーションでは動作しないように見えたので、私のクエリが働いていましたか? Spring Dataが@Fetch注釈を無視している可能性はありますか?
  • デフォルトのfindAll()を単純なエンティティにのみ使用する必要があるかどうかを尋ねることができます。 (シンプルはアソシエーションなしと定義されています)。
+0

JPA仕様の一部ではない '@ Fetch'アノテーションを意味しますか?どこから来たのですか? –

答えて

1

デフォルトフェッチモードは遅延です。フェッチモードthis

whether the default findAll() should only be used for simple entities? (where simple is defined as no associations). 

通過することができ春データJPA.Youで作業するときには、常に@NamedEntityGraph@EntityGraph注釈を使用することをお勧めします - LAZYするプライマリテーブルに対してのみ火災。コードで、親テーブルの依存関係を持つ他のメソッドを呼び出すと、Fetch Mode - SELECTが発生します。

関連する問題