2017-05-30 1 views
0

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] 
+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-- –

Antwort

0

Sie können unter dem folgenden Code versuchen.

@Query("select logEntry from LogEntry logEntry join fetch logEntry.parameters as params join fetch logEntry.guest as guest where guest.id = :guestId order by logEntry.creationDate desc") 
Page<LogEntry> findByGuestOrderByCreationDateDesc(@Param Long guestId, Pageable pageable); 
+0

Ich bekomme immer noch diesen Fehler: Verursacht von: Java .lang.IllegalArgumentException: org.hibernate.QueryException: Abfrage angegebenen Join-Abruf, aber der Besitzer der abgerufenen Assoziation war nicht in der Auswahlliste [FromElement {explizit, Sammlung Join, Fetch Join, holen nicht faule Eigenschaften, classAlias ​​= Parameter , role = domain.guest.LogEntry.parameters, Tabellenname = {none}, tableAlias ​​= Parameter1_, Ursprung = null, Spalten = {, Klassenname = null}}] [Anzahl (logEntry) aus domain.guest.LogEntry logEntry Join Fetch auswählen logEntry.parameters als params Join fetch logEntry.guest als Gast where guest.id =: guestId] – NoobieNoob

+0

Ich denke, die Abfrage, die Sie versucht haben, funktioniert möglicherweise nicht. Weil Sie count (logEntry) hinzugefügt haben. Wählen Sie count (logEntry) aus domain.guest.LogEntry logEntry Join fetch logEntry.parameters als Parameter Join fetch logEntry.guest als Gast where guest.id =: guestId. Dies kann mithilfe der systemeigenen Abfrage behoben werden. Können Sie bitte die Tabellennamen für diese angeben? Also kann ich dir helfen, die Abfrage dafür zu schreiben. – Sudhakar