Spring fournit deux mécanismes qui peuvent être utilisés pour limiter les données à récupérer.
Projections
Les projections peuvent vous aider à réduire les données extraites de la base de données en définissant exactement les attributs que vous souhaitez récupérer.
Exemple :
@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);
}
Graphique d'entité
Annotation EntityGraph
peut vous aider à réduire le nombre de requêtes dans la base de données, en définissant exactement les entités liées que vous devez récupérer.
Exemple :
@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
}
Il existe deux types de EntityGraph
:
EntityGraphType.LOAD
- est utilisé pour spécifier un graphe d'entité, les attributs spécifiés par les nœuds d'attribut du graphe d'entité sont traités commeFetchType.EAGER
et les attributs qui ne sont pas spécifiés sont traités en fonction de leurFetchType
spécifié ou par défaut .EntityGraphType.FETCH
- est utilisé pour spécifier un graphe d'entité, les attributs spécifiés par les nœuds d'attribut du graphe d'entité sont traités commeFetchType.EAGER
et les attributs qui ne sont pas spécifiés sont traités commeFetchType.LAZY
.
PS : Rappelez-vous également que vous pouvez définir le type de récupération différée :@ManyToOne(fetch = FetchType.LAZY)
et JPA ne récupère pas les entités enfants lorsque le parent est en cours de récupération.