Spring fornisce due meccanismi che possono essere utilizzati per limitare il recupero dei dati.
Proiezioni
Le proiezioni possono aiutarti a ridurre i dati, recuperati dal database, impostando esattamente quali attributi vuoi recuperare.
Esempio:
@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);
}
Grafico entità
Annotazione EntityGraph può aiutarti a ridurre la quantità di query al database, impostando esattamente quali entità correlate devi recuperare.
Esempio:
@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
}
Esistono due tipi di EntityGraph :
EntityGraphType.LOAD- viene utilizzato per specificare un grafico di entità, gli attributi specificati dai nodi di attributo del grafico di entità vengono trattati comeFetchType.EAGERe gli attributi non specificati vengono trattati in base alFetchTypespecificato o predefinito .EntityGraphType.FETCH- viene utilizzato per specificare un grafico di entità, gli attributi specificati dai nodi di attributo del grafico di entità vengono trattati comeFetchType.EAGERe gli attributi non specificati vengono trattati comeFetchType.LAZY.
PS: Ricorda inoltre che puoi impostare il tipo di recupero pigro:@ManyToOne(fetch = FetchType.LAZY) e JPA non recupererà le entità figlio durante il recupero del genitore.