Ich habe einige Leistungsprobleme mit einer einfachen Abfrage in Spring Data JPA.Spring Data JPA - Abfrage mit ElementCollection - Niedrige Leistung
Modell:
@Entity
public class LogEntry {
..
@NotNull
@ElementCollection(fetch = FetchType.EAGER)
private List<String> parameters;
@ManyToOne
private Guest guest;
..
}
Repository:
Page<LogEntry> findByGuestOrderByCreationDateDesc(Guest guest, Pageable pageable);
Ich möchte mit allen Parametern eine Liste der Log-Einträge angezeigt werden soll. Aber die Abfrage ist unglaublich langsam. Nachdem alle Einträge gefunden wurden, wird nach den Parametern für jeden Eintrag gesucht.
Logs zeigen viele dieser Zeilen:
Hibernate: select parameters0_.LogEntry_id as LogEntry1_8_0_, parameters0_.parameters as paramete2_9_0_ from LogEntry_parameters parameters0_ where parameters0_.LogEntry_id=?
ich für eine Art und Weise bin auf der Suche um die Abfrage zu verbessern. Ich habe versucht, einen Join-Fetch ohne Erfolg zu verwenden.
@Query("select l from LogEntry l join fetch l.parameters where l.guest = ?1 order by l.creationDate desc")
Caused by: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,collection join,fetch join,fetch non-lazy properties,classAlias=null,role=domain.guest.LogEntry.parameters,tableName={none},tableAlias=parameters1_,origin=null,columns={,className=null}}] [select count(l) from domain.guest.LogEntry l join fetch l.parameters where l.guest = ?1]
Das Problem ist nicht mit der Abfrage, die Sie angegeben haben. Es ist mit der Count-Abfrage, die Spring von der Abfrage ableitet. AFAIR, Sie können eine CountQuery für die Query-Annotation angeben (die den Join-Fetch nicht übernehmen würde (was ein linker Join-Fetc (BTW) sein sollte). http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/Query.html#countQuery-- –