2017-05-30 37 views
0

Spring Data JPAの簡単なクエリでパフォーマンスの問題が発生しています。Spring Data JPA - ElementCollectionを使用したクエリ - 低パフォーマンス

モデル:

@Entity 
public class LogEntry { 
    .. 
    @NotNull 
    @ElementCollection(fetch = FetchType.EAGER) 
    private List<String> parameters; 

    @ManyToOne 
    private Guest guest; 
    .. 
} 

リポジトリ:

Page<LogEntry> findByGuestOrderByCreationDateDesc(Guest guest, Pageable pageable); 

私はすべてのパラメータを持つログエントリの一覧を表示したいです。しかし、クエリは非常に遅いです。すべてのエントリを見つけたら、各エントリのパラメータのクエリを開始します。私は、クエリを改善する方法を探しています

Hibernate: select parameters0_.LogEntry_id as LogEntry1_8_0_, parameters0_.parameters as paramete2_9_0_ from LogEntry_parameters parameters0_ where parameters0_.LogEntry_id=? 

ログは、これらの行の多くを示しています。私は成功せずに結合フェッチを使用しようとしました。

@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

問題は、提供したクエリではありません。これは、Springがクエリから派生したカウントクエリにあります。 AFAIRでは、QueryアノテーションにcountQueryを指定することができます(これは結合フェッチを妨害しません(左結合fetc、BTWです))。 http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/Query.html#countQuery-- –

答えて

0

以下のコードを試すことができます。

@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

私はまだこのエラーが発生します。原因:java .lang.IllegalArgumentException:org.hibernate.QueryException:クエリが指定された結合フェッチを指定しましたが、フェッチされた関連付けの所有者が選択リストに存在しませんでした[FromElement {明示的、コレクション結合、フェッチ結合、非遅延属性のフェッチ、classAlias = params domain.guest.LogEntryからのcount(logEntry)の選択logEntry join fetch(role = domain.guest.LogEntry.parameters、tableName = {none}、tableAlias = parameters1_、origin = null、columns = {、className = null}}] logEntry.parametersとしてparamsはlogEntry.guestをゲストとして取得します。guest.id =:guestId] – NoobieNoob

+0

あなたが試したクエリはうまくいかないかもしれません。 count(logEntry)を追加したためです。 domain.guest.LogEntryからlogEntryを選択(logEntry)logEntry logEntry.parametersを取得します。paramsはlogEntry.guestをguestとして取得します。guest.id =:guestIdです。これはネイティブクエリを使用して修正できます。これらのテーブル名を指定してください。だから、私はあなたがその質問を書くのを助けることができます。 – Sudhakar

関連する問題