Spring proporciona dos mecanismos que se pueden usar para limitar la obtención de datos.
Proyecciones
Las proyecciones pueden ayudarlo a reducir los datos, recuperados de la base de datos, al establecer qué atributos exactamente desea obtener.
Ejemplo:
@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);
}
Gráfico de entidad
Anotación EntityGraph
puede ayudarlo a reducir la cantidad de consultas a la base de datos al establecer exactamente qué entidades relacionadas necesita buscar.
Ejemplo:
@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
}
Hay dos tipos de EntityGraph
:
EntityGraphType.LOAD
- se utiliza para especificar un gráfico de entidades, los atributos especificados por los nodos de atributos del gráfico de entidades se tratan comoFetchType.EAGER
y los atributos que no se especifican se tratan de acuerdo con suFetchType
especificado o predeterminado .EntityGraphType.FETCH
- se utiliza para especificar un gráfico de entidades, los atributos especificados por los nodos de atributos del gráfico de entidades se tratan comoFetchType.EAGER
y los atributos que no se especifican se tratan comoFetchType.LAZY
.
PD: Recuerde también que puede establecer el tipo de búsqueda diferida:@ManyToOne(fetch = FetchType.LAZY)
y JPA no obtendrá entidades secundarias cuando se obtengan las principales.