Spring giver to mekanismer, der kan bruges til at begrænse data, der skal hentes.
Projektioner
Projektioner kan hjælpe dig med at reducere data, hentet fra databasen, ved at indstille præcis, hvilke attributter du vil hente.
Eksempel:
@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);
}
Enhedsgraf
Annotation EntityGraph
kan hjælpe dig med at reducere mængden af forespørgsler til databasen ved at indstille, hvilke præcist relaterede enheder du skal hente.
Eksempel:
@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
}
Der er to typer EntityGraph
:
EntityGraphType.LOAD
- bruges til at specificere en entitetsgraf, attributter, der er specificeret af attributknuder i entitetsgrafen, behandles somFetchType.EAGER
og attributter, der ikke er specificeret, behandles i henhold til deres specificerede eller standardFetchType
.EntityGraphType.FETCH
- bruges til at specificere en entitetsgraf, attributter, der er specificeret af attributknuder i entitetsgrafen, behandles somFetchType.EAGER
og attributter, der ikke er specificeret, behandles somFetchType.LAZY
.
PS: Husk også, at du kan indstille lazy fetch type:@ManyToOne(fetch = FetchType.LAZY)
og JPA vil ikke hente underordnede enheder, når forælderen hentes.