Spring bietet zwei Mechanismen, die verwendet werden können, um die abzurufenden Daten einzuschränken.
Projektionen
Projektionen können Ihnen dabei helfen, die aus der Datenbank abgerufenen Daten zu reduzieren, indem Sie festlegen, welche Attribute Sie abrufen möchten.
Beispiel:
@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);
}
Entitätsdiagramm
Anmerkung EntityGraph
kann Ihnen helfen, die Anzahl der Abfragen an die Datenbank zu reduzieren, indem Sie festlegen, welche genau verwandten Entitäten Sie abrufen müssen.
Beispiel:
@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
}
Es gibt zwei Arten von EntityGraph
:
EntityGraphType.LOAD
- wird verwendet, um einen Entitätsgraphen zu spezifizieren, Attribute, die durch Attributknoten des Entitätsgraphen spezifiziert sind, werden alsFetchType.EAGER
behandelt und nicht angegebene Attribute werden gemäß ihrem angegebenen oder standardmäßigenFetchType
behandelt .EntityGraphType.FETCH
- wird verwendet, um einen Entitätsgraphen zu spezifizieren, Attribute, die durch Attributknoten des Entitätsgraphen spezifiziert sind, werden alsFetchType.EAGER
behandelt und nicht angegebene Attribute werden alsFetchType.LAZY
behandelt .
PS: Denken Sie auch daran, dass Sie den Lazy-Fetch-Typ festlegen können:@ManyToOne(fetch = FetchType.LAZY)
und JPA ruft keine untergeordneten Entitäten ab, wenn die übergeordnete Entität abgerufen wird.