Spring tillhandahåller två mekanismer som kan användas för att begränsa data som ska hämtas.
Projektioner
Projektioner kan hjälpa dig att minska data, hämtad från databasen, genom att ställa in exakt vilka attribut du vill hämta.
Exempel:
@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);
}
Enhetsdiagram
Anteckning EntityGraph
kan hjälpa dig att minska antalet förfrågningar till databasen genom att ställa in exakt vilka relaterade enheter du behöver hämta.
Exempel:
@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
}
Det finns två typer av EntityGraph
:
EntityGraphType.LOAD
- används för att ange en entitetsgraf, attribut som specificeras av attributnoder i entitetsgrafen behandlas somFetchType.EAGER
och attribut som inte är specificerade behandlas enligt deras specificerade eller standardFetchType
.EntityGraphType.FETCH
- används för att ange en entitetsgraf, attribut som specificeras av attributnoder i entitetsgrafen behandlas somFetchType.EAGER
och attribut som inte är specificerade behandlas somFetchType.LAZY
.
PS: Kom också ihåg att du kan ställa in lazy hämtningstyp:@ManyToOne(fetch = FetchType.LAZY)
och JPA kommer inte att hämta underordnade enheter när förälder hämtas.