Springは、フェッチするデータを制限するために使用できる2つのメカニズムを提供します。
プロジェクション
プロジェクションは、フェッチする属性を正確に設定することで、データベースから取得するデータを削減するのに役立ちます。
例:
@Entity
class Person {
@Id UUID id;
String firstname, lastname;
@OneToOne
Address address;
}
@Entity
static class Address {
@Id UUID id;
String zipCode, city, street;
}
interface NamesOnly {
String getFirstname();
String getLastname();
}
@Repository
interface PersonRepository extends Repository<Person, UUID> {
Collection<NamesOnly> findByLastname(String lastname);
}
エンティティグラフ
注釈EntityGraph
フェッチする必要のある正確に関連するエンティティを設定することで、データベースへのクエリの量を減らすのに役立ちます。
例:
@Entity
@NamedEntityGraph(name = "GroupInfo.detail", attributeNodes = @NamedAttributeNode("members"))
public class GroupInfo {
@Id UUID id;
@ManyToMany //default fetch mode is lazy.
List<GroupMember> members = new ArrayList<GroupMember>();
}
@Repository
public interface GroupRepository extends CrudRepository<GroupInfo, String> {
@EntityGraph(value = "GroupInfo.detail", type = EntityGraphType.LOAD)
GroupInfo getByGroupName(String name); //Despite of GroupInfo.members has FetchType = LAZY, it will be fetched because of using EntityGraph
}
EntityGraph
には2つのタイプがあります :
-
EntityGraphType.LOAD
-エンティティグラフを指定するために使用されます。エンティティグラフの属性ノードによって指定された属性は、FetchType.EAGER
として扱われます。 指定されていない属性は、指定された、またはデフォルトのFetchType
に従って処理されます。 。 -
EntityGraphType.FETCH
-エンティティグラフを指定するために使用されます。エンティティグラフの属性ノードによって指定された属性は、FetchType.EAGER
として扱われます。 指定されていない属性はFetchType.LAZY
として扱われます 。
PS: また、レイジーフェッチタイプを設定できることを忘れないでください:@ManyToOne(fetch = FetchType.LAZY)
親がフェッチされているとき、JPAは子エンティティをフェッチしません。