Spring zapewnia dwa mechanizmy, których można użyć do ograniczenia danych do pobrania.
Projekcje
Projekcje mogą pomóc zredukować dane pobierane z bazy danych poprzez ustawienie, jakie dokładnie atrybuty chcesz pobrać.
Przykład:
@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);
}
Wykres encji
Adnotacja EntityGraph
może pomóc w zmniejszeniu liczby zapytań do bazy danych, ustawiając dokładnie powiązane encje, które musisz pobrać.
Przykład:
@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
}
Istnieją dwa typy EntityGraph
:
EntityGraphType.LOAD
- służy do określenia grafu encji, atrybuty określone przez węzły atrybutów grafu encji są traktowane jakoFetchType.EAGER
a atrybuty, które nie są określone, są traktowane zgodnie z ich określonym lub domyślnymFetchType
.EntityGraphType.FETCH
- służy do określenia grafu encji, atrybuty określone przez węzły atrybutów grafu encji są traktowane jakoFetchType.EAGER
a atrybuty, które nie są określone, są traktowane jakoFetchType.LAZY
.
PS: Pamiętaj też, że możesz ustawić leniwy typ pobierania:@ManyToOne(fetch = FetchType.LAZY)
a JPA nie będzie pobierać jednostek podrzędnych, gdy pobierany jest element nadrzędny.