2009-04-05 11 views
4

私はこのような動的なインスタンス化を使用することができます。NHibernateでCriteria APIを使ってカスタムプロジェクションを行うにはどうしたらいいですか? HQLで

select new ItemRow(item.Id, item.Description, bid.Amount) 
from Item item join item.Bids bid 
where bid.Amount > 100 

今私はクライテリアAPIを使用して動的に私のクエリを作成する必要があります。 HQLで取得したのと同じ結果を、Criteria APIを使用して取得するにはどうすればよいですか?

ありがとうございます。

http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection

希望に役立ちます:

答えて

1

あなたはNHibernateは2.0.1 GAを使用していると仮定すると、ここで適切なドキュメントです!

+0

私は1.2を使用しています。私はそれが動作するかどうか試してみるつもりです。ありがとう。 – sker

1

プロジェクションを使用する場合、戻り値の型は、条件型ではなくオブジェクトまたはオブジェクト[]になります。変圧器を使用する必要があります。ここで

は簡単ResultTransformerです:

private class ProjectionTransformer implements ResultTransformer { 
     private String[] propertysList; 
     private Class<?> classObj; 

     /** 
     * @param propertysList 
     */ 
     public ProjectionTransformer(String[] propertysList) { 
      this.classObj = persistentClass; 
      this.propertysList = propertysList; 
     } 

     /** 
     * @param classObj 
     * @param propertysList 
     */ 
     public ProjectionTransformer(Class<?> classObj, String[] propertysList) { 
      this.classObj = classObj; 
      this.propertysList = propertysList; 
     } 

     @SuppressWarnings("unchecked") 
     public List transformList(List arg0) { 
      return arg0; 
     } 

     public Object transformTuple(Object[] resultValues, String[] arg1) { 
      Object retVal = null; 
      try { 
       retVal = Class.forName(classObj.getName()).newInstance(); 
       int dot = -1; 
       for (int i = 0; i < resultValues.length; i++) { 
        if ((dot = propertysList[i].indexOf(".")) > 0) { 
         propertysList[i] = propertysList[i].substring(0, dot); 
        } 
        PropertyUtils.setProperty(retVal, propertysList[i], resultValues[i]); 
       } 
      } catch (Exception e) {// convert message into a runtimeException, don't need to catch 
       throw new RuntimeException(e); 
      } 
      return retVal; 
     } 
    } 

は、ここではそれを使用する方法は次のとおりです。

ProjectionList pl = (...) 
String[] projection = new String[]{"Id","Description","Bid.Amount"}; 
crit.setProjection(pl).setResultTransformer(new ProjectionTransformer(projection)); 

私は関係(例:Bid.Amount)のためにそれをテストしていません。

7

AliasToBean結果トランスフォーマーを使用できます。 (Doc 1.2)すべての投影を同じ名前のプロパティに割り当てます。

session.CreateCriteria(typeof(Item), "item") 
    .CreateCriteria("Bids", "bid") 
    .SetProjection(Projections.ProjectionList() 
    .Add(Projections.Property("item.Id"), "Id") 
    .Add(Projections.Property("item.Description"), "Description") 
    .Add(Projections.Property("bid.Amount"), "Amount")) 
    .Add(Expression.Gt("bid.Amount", 100)) 
    .SetResultTransformer(Transformers.AliasToBean(typeof(ItemRow))) 
    .List(); 
+0

このシンプルな宝石をありがとう! –

関連する問題