2013-11-21 103 views
2

我無法指定QueryOver order by子句的屬性名稱與列名稱不匹配的對象。通過別名與NHibernate的QueryOver使用屬性名稱而不是列映射

這裏是對象: -

public class ObjectInstance 
{ 
    public ObjectInstance() 
    { 
     IsActive = true; 
    } 

    public virtual bool IsActive { get; set; } 
}  

而且休眠流利的映射: -

public class ObjectInstanceMap : ClassMap<ObjectInstance> 
{ 
    public ObjectInstanceMap() 
    { 
     Table("ObjectInstances"); 
     Id(obj => obj.ObjectInstanceId).GeneratedBy.GuidComb(); 
     Map(x => x.IsActive, "ObjectInstanceIsActive"); 
    } 
} 

正如你可以看到在數據庫稱爲ObjectInstanceIsActive列,但被映射到ObjectInstance對象上的IsActive屬性。試圖讓一個IList出了QueryOver如下: -

IList<ObjectInstance> result = this.Session.QueryOver<ObjectInstance>(() => objectInstance) 
    .UnderlyingCriteria.AddOrder(new Order("ObjectInstanceIsActive", true)) 
    .List<ObjectInstance>(); 

拋出一個錯誤,指出ObjectInstance對象不具有ObjectInstanceIsActive屬性,這是正確的,事實並非如此。

如果我改變的標準是: -

IList<ObjectInstance> result = this.Session.QueryOver<ObjectInstance>(() => objectInstance) 
    .UnderlyingCriteria.AddOrder(new Order("IsActive", true)) 
    .List<ObjectInstance>(); 

則Hibernate成功生成SQL查詢,但其尋找一個叫IsActive列其中不存在和錯誤。

我也嘗試添加下面的預測(單獨),但沒有幫助。

.Select(Projections.ProjectionList().Add(Projections.Property("IsActive"), "ObjectInstanceIsActive")) 
.Select(Projections.ProjectionList().Add(Projections.Property("IsActive"), "ObjectInstanceIsActive")) 

回答

0

看起來我已經過簡化我的例子。 ObjectInstance是一個基類,作爲獨立的一切,MichaC和Radim指出,一切都很完美。在我的特定場景中,我有一個從它繼承的子類,它將IsActive列重新映射到不被忽視的另一個別名下。

乾杯傢伙。

1
IList<ObjectInstance> result = this.Session.QueryOver<ObjectInstance>(() => objectInstance) 
    .UnderlyingCriteria.AddOrder(new Order("IsActive", true)) 
    .List<ObjectInstance>(); 

作品其實對我很好,創造如預期下面的語句:

SELECT this_.ObjectInstanceId as ObjectIn1_19_0_, this_.ObjectInstanceIsActive as 
ObjectIn2_19_0_ FROM ObjectInstances this_ 
ORDER BY this_.ObjectInstanceIsActive asc 
1

流暢的定位和自身正在尋找很好的查詢。再次檢查在使用new Order("IsActive", true)的情況下產生的SQL ...這是可疑的。

順便說一句,更流暢(和類型安全)語法是:

var result = Session 
    .QueryOver<ObjectInstance>(() => objectInstance) 
    .OrderBy(() => objectInstance.IsActive) 
     .Asc 
    .List<ObjectInstance>(); 
相關問題