2017-09-19 7 views
0

私はカスタムクエリは、ユーザーがIDJPAは価値多くのクエリ

platformsId=1 
typesId=1 

2は、約18個のクエリは、私はパラメータの関数で作成 私のクラス

@Entity 
public class Head { 

    @Id 
    private Integer id; 

    @OneToMany(mappedBy = "head") 
    private List<PackageInstances> packageInstance; 

    @ManyToOne 
    private Platforms platform; 

    @ManyToOne 
    private Types type; 

    @ManyToOne 
    private Owners Owner; 

    @ManyToOne 
    private Pack package; 

} 

クエリを行っている入力しないフェッチ

@Override 
public Page<Head> advancedSearch(HeadSearch search, Pageable page) { 
    Specification<Head> specification = (Root<Head> root, CriteriaQuery<?> cq, CriteriaBuilder cb) -> { 
     Predicate p = cb.conjunction(); 

     if (search.getId() != null) { 
      p.getExpressions().add(cb.equal(root.get("id"), search.getId())); 
     } 

     if (search.getOwnersId() != null) { 
      Join<Head, Owners> owners = root.join("Owner"); 
      p.getExpressions().add(cb.equal(owners.get("id"), search.getOwnersId())); 
     } 

     if (search.getTypesId() != null) { 
      Join<Head, Types> types = (Join) root.fetch("type"); 
      p.getExpressions().add(cb.equal(types.get("id"), search.getTypesId())); 
     } 

     if (search.getPlatformsId() != null) { 

      Join<Head, Platforms> platform = (Join) root.fetch("platform"); 
      p.getExpressions().add(cb.equal(platform.get("id"), search.getPlatformsId())); 
     } 

     if (search.getPackagesId() != null) { 
      Join<Head, Pack> packages = root.join("package"); 
      p.getExpressions().add(cb.equal(packages.get("id"), search.getPackagesId())); 
     } 
     return p; 
    }; 

    return this.findAll(specification, page); 
    } 

確かにページングは​​いくつかのクエリを実行しますが、実行されたクエリはすべて必ずしも発生しません。 フェッチは何も変更していないようです。

JoinColumnを追加しようとしましたが、同じ問題が発生しました。

これを最適化する方法はありますか?それほど多くのクエリを回避する方法はありますか?

+0

「フェッチは何も変えていないようです」と言うと、何を試しましたか? @ManyToOneのデフォルトのフェッチ戦略はEAGERなので –

+0

私が行ったクエリをチェックすると、私はフェッチコマンドを使用します –

答えて

1

JPA 2.1 specification@ManyToOneの関係によれば、デフォルトのフェッチ戦略はFetchType.Eagerであり、エンティティクラスはその戦略でその種のクラスを4つ持っています。

あなたが上fetchを使用する基準を構築しているTypesPlatforms(とそれを行うためのデータがある場合のみ)と2人でjoin。したがって、エンティティがリクエストで検索されるとき、hibernateは未解決のすべての@ManyToOneリレーションで熱心にフェッチを実行します.ごとにユーザーの入力が2から4の間であります。

数を減らすか、またはあなたが関係に怠惰にFetchStrategyを設定する必要がありますいずれかを要求するには:

@ManyToOne(fetch = FetchType.LAZY) 

または最初のクエリですべてをフェッチを強制するようにコードをリファクタリングします。

+0

私もPackageInstancesに参加する必要がありますか? –

+0

これは、クエリから期待される結果、必要に応じて取り込む必要があるエンティティの種類によって異なります。 –

関連する問題