Spring cung cấp hai cơ chế có thể được sử dụng để giới hạn dữ liệu được tìm nạp.
Phép chiếu
Phép chiếu có thể giúp bạn giảm bớt dữ liệu, được truy xuất từ cơ sở dữ liệu, bằng cách đặt chính xác những thuộc tính bạn muốn tìm nạp.
Ví dụ:
@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);
}
Biểu đồ thực thể
Chú thích EntityGraph
có thể giúp bạn giảm số lượng truy vấn đến cơ sở dữ liệu, bằng cách đặt những thực thể liên quan chính xác mà bạn cần tìm nạp.
Ví dụ:
@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
}
Có hai loại EntityGraph
:
-
EntityGraphType.LOAD
- được sử dụng để chỉ định một biểu đồ thực thể, các thuộc tính được chỉ định bởi các nút thuộc tính của biểu đồ thực thể được coi làFetchType.EAGER
và các thuộc tính không được chỉ định được xử lý theoFetchType
được chỉ định hoặc mặc định của chúng . -
EntityGraphType.FETCH
- được sử dụng để chỉ định một biểu đồ thực thể, các thuộc tính được chỉ định bởi các nút thuộc tính của biểu đồ thực thể được coi làFetchType.EAGER
và các thuộc tính không được chỉ định được coi làFetchType.LAZY
.
Tái bút: Cũng nên nhớ rằng bạn có thể đặt kiểu tìm nạp lười:@ManyToOne(fetch = FetchType.LAZY)
và JPA sẽ không tìm nạp các thực thể con khi mẹ đang được tìm nạp.