Spring menyediakan dua mekanisme yang dapat digunakan untuk membatasi data yang akan diambil.
Proyeksi
Proyeksi dapat membantu Anda mengurangi data, yang diambil dari database, dengan menyetel atribut apa yang ingin Anda ambil.
Contoh:
@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);
}
Grafik entitas
Anotasi EntityGraph
dapat membantu Anda mengurangi jumlah kueri ke database, dengan menyetel entitas terkait apa yang perlu Anda ambil.
Contoh:
@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
}
Ada dua jenis EntityGraph
:
EntityGraphType.LOAD
- digunakan untuk menentukan grafik entitas, atribut yang ditentukan oleh node atribut dari grafik entitas diperlakukan sebagaiFetchType.EAGER
dan atribut yang tidak ditentukan diperlakukan sesuai denganFetchType
yang ditentukan atau defaultnya .EntityGraphType.FETCH
- digunakan untuk menentukan grafik entitas, atribut yang ditentukan oleh node atribut dari grafik entitas diperlakukan sebagaiFetchType.EAGER
dan atribut yang tidak ditentukan diperlakukan sebagaiFetchType.LAZY
.
PS: Ingat juga bahwa Anda dapat menyetel jenis pengambilan lambat:@ManyToOne(fetch = FetchType.LAZY)
dan JPA tidak akan mengambil entitas anak saat induk diambil.