Spring предоставя два механизма, които могат да се използват за ограничаване на извличането на данни.
Прогнози
Прогнозите могат да ви помогнат да намалите данните, извлечени от базата данни, като зададете какви точно атрибути искате да извлечете.
Пример:
@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
:
EntityGraphType.LOAD
- се използва за указване на графа на обект, атрибутите, които са посочени от възлите на атрибута на графиката на обекта, се третират катоFetchType.EAGER
и атрибутите, които не са посочени, се третират според техния зададен или по подразбиранеFetchType
.EntityGraphType.FETCH
- се използва за указване на графа на обект, атрибутите, които са посочени от възлите на атрибута на графиката на обекта, се третират катоFetchType.EAGER
и атрибути, които не са посочени, се третират катоFetchType.LAZY
.
PS: Също така не забравяйте, че можете да зададете тип отложено извличане:@ManyToOne(fetch = FetchType.LAZY)
и JPA няма да извлича дъщерни обекти, когато родителят се извлича.