2017-03-25 9 views
2

そこは、Hibernateクエリは次のとおりです。Hibernateクエリに複数のBeanエイリアスがある場合、リストの戻り値の型は何ですか?

@Override 
@Transactional 
public List<> getClassificationOfPta() { 

    String hql = "select p , c from Pta p join p.classePta c where c.niveau = 2 order by p.creation"; 

    Session sessionDynamic = Utils.createDynamicSession(env); 

    Query query = sessionDynamic.createQuery(hql); 

    @SuppressWarnings("unchecked") 
    List<> list = (List<>) query.list(); 

    sessionDynamic.close(); 

    return list; 

} 

ので<>の内側に書き込むためのものは何ですか?

答えて

5

クエリをそのままにしておくと、オブジェクト配列のリスト:List<Object[]>が得られます。

配列のゼロインデックスはPtaインスタンスを保持し、最初のインデックスはClassPtaインスタンスを保持します。

この場合、その結果セットを手動でアンラーする必要があります。

結果クラスを使用することによって、そのプロセスを自動化する方法があります:次のように

package com.myapp; 

public class Result{ 

    private Pta pta; 
    private ClassPta classPta; 

    public (Pta pta, ClassPta classPta){ 
      this.pta = pta; 
      this.classPta = classPta; 
    } 

} 

その後、クエリとトランザクションメソッドの実装を変更する必要があります:

@Transactional 
public List<Result> getClassificationOfPta() { 

    String hql = "select new com.myapp.Result(p as pta, c as classPta) 
     from Pta p join p.classePta c where c.niveau = 2 order by p.creation"; 

    Session sessionDynamic = Utils.createDynamicSession(env); 

    Query query = sessionDynamic.createQuery(hql); 

    List<Result> list = (List<Result>) query.list(); 

    sessionDynamic.close(); 

    return list; 

} 

2番目の服装はもちろん清潔ですが、呼び出しはあなたのものです。

関連する問題