Spring biedt twee mechanismen die kunnen worden gebruikt om het ophalen van gegevens te beperken.
Projecties
Projecties kunnen u helpen om gegevens, opgehaald uit de database, te verminderen door in te stellen welke attributen u precies wilt ophalen.
Voorbeeld:
@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);
}
Entiteitsgrafiek
Annotatie EntityGraph
kan u helpen het aantal zoekopdrachten naar de database te verminderen door in te stellen welke gerelateerde entiteiten u precies moet ophalen.
Voorbeeld:
@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
}
Er zijn twee soorten EntityGraph
:
EntityGraphType.LOAD
- wordt gebruikt om een entiteitsgrafiek te specificeren, attributen die zijn gespecificeerd door attribuutknooppunten van de entiteitsgrafiek worden behandeld alsFetchType.EAGER
en attributen die niet gespecificeerd zijn, worden behandeld volgens hun gespecificeerde of standaardFetchType
.EntityGraphType.FETCH
- wordt gebruikt om een entiteitsgrafiek te specificeren, attributen die zijn gespecificeerd door attribuutknooppunten van de entiteitsgrafiek worden behandeld alsFetchType.EAGER
en attributen die niet zijn gespecificeerd, worden behandeld alsFetchType.LAZY
.
PS: Onthoud ook dat u het luie ophaaltype kunt instellen:@ManyToOne(fetch = FetchType.LAZY)
en JPA zal geen onderliggende entiteiten ophalen wanneer de bovenliggende entiteit wordt opgehaald.