2015-06-01 84 views
1

我使用NHibernate和下面創建查詢: -的NHibernate的ICriteria返回空結果

ICriteria criteria = session.CreateCriteria<PayinoutBookentry>(); 
ProjectionList projList = Projections.ProjectionList(); 
      projList.Add(Projections.GroupProperty("PaymentOption").As("PaymentOption")); 
      criteria.SetProjection(projList); 
      criteria.SetResultTransformer(Transformers.AliasToBean<PayinoutBookentry>()); 

IList<PayinoutBookentry> payinoutBookentryList = criteria.List<PayinoutBookentry>(); 

POCO:

public class PayinoutBookentry 
{ 
    public virtual int PayinoutBookentryId { get; set; } 

    public virtual Methodofpayment PaymentOption { get; set; } 
} 

映射:

public PayinoutBookentryMap() 
{ 
     Table("payinout_bookentry"); 
     Schema("test"); 
     Lazy(true); 
     Id(x => x.PayinoutBookentryId, map => { 
      map.Column("PAYINOUT_BOOKENTRY_ID"); 
      map.Generator(Generators.Native); }); 

     ManyToOne(x => x.PaymentOption, map => 
     { 
      map.Column("PAYMENT_OPTION"); 
      // map.NotNullable(true); 
      map.Cascade(Cascade.None); 
     }); 

但是,當我試圖讓列表我只在列表中獲得一行,並且該行有空對象。

有人能讓我讓GroupProperty有什麼問題嗎?因爲沒有GroupProperty它工作正常。

回答

4

我們收到的結果是非常正確的 - 與查詢有關。由於ICriteria查詢以上將在這條SQL語句結束:

SELECT this_.PAYMENT_OPTION as y0_ 
FROM [test].[payinout_bookentry] this_ 
GROUP BY  this_.PAYMENT_OPTION 

正如我們所看到的,只有GROUP BY列是SELECT條款......沒有別的選擇。

... 
ProjectionList projList = Projections.ProjectionList(); 
// just one projected SELECT statement 
projList.Add(Projections.GroupProperty("PaymentOption").As("PaymentOption")); 
// still only one SELECT result 
criteria.SetProjection(projList); 

所以,即使我們在下一行使用Transformer

// iterates retrieved data and convert them into properties 
criteria.SetResultTransformer(Transformers.AliasToBean<PayinoutBookentry>()); 

我們仍然有幾乎爲零無處不(和默認值類型) - 因爲這是它如何工作的。

那麼,我們可以做些什麼來改變呢?

首先,我們可以添加更多的列到投影

... 
projList.Add(Projections.Count("PayinoutBookentryId").As("PayinoutBookentryId")); 
... 

但事實上,那將沒有任何意義,因爲在ID列,我們知道會所有的ID都(轉化)的計...這是不是我們想要的。

這一切都在發生,因爲(我猜)在這裏使用的投影和分組方式不正確。它提供某種報告的(我們創建DTO和計算多錢怎麼樣,我們算每某種類型有)

但我們希望得到BookEntries相關的一些支付情況。我會簡單地使用WHERE,例如:

criteria.Add(Restrictions 
       .Where<PayinoutBookentry>(o => o.PaymentOption.ID == somePaymentOptionType)); 

和方式,我們可以得到所有的項目,涉及到過濾支付類型...

瞭解更多關於它: