私は(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()を単純なエンティティにのみ使用する必要があるかどうかを尋ねることができます。 (シンプルはアソシエーションなしと定義されています)。
JPA仕様の一部ではない '@ Fetch'アノテーションを意味しますか?どこから来たのですか? –