2012-04-25 69 views
1

我是Nhibernate的新手。我的問題是,我想通過使用不包含在我的實體(即hbm)中的列來縮小查詢範圍。我想要做這樣的事情:NHibernate QueryOver可以有SQL-where語句嗎?

Session.QueryOver<MyEntity>() 
    .SQL_Where("MyFlag = 1") 

因爲我沒有使用該標誌後,我不想它包括對實體

我知道我可以使用:

Session 
    .CreateSQLQuery("SELECT A,B,C FROM ENTITY WHERE MyFlag = 1") 
    .SetResultTransformer(Transformers.AliasToBean<MyEntity>()) 
    .List<MyEntity>(); 

這將是很好使用QueryOver <>(),它如果添加一列更安全等

回答

2

您可以使用過濾器: -

在您的映射類定義中添加過濾器,但這會影響所有返回的行

例如,

<class name="Domain.Model.MyEntity, Domain.Model" table="MyTable" 
     where="(MyFlag=1)"> 
    ... 
</class> 

或有可能使用條件過濾器與QueryOver

<filter-def name="SetMyFlag"> 
    <filter-param name=":flag" type="System.Int"/> 
</filter-def> 

<class name="Domain.Model.MyEntity, Domain.Model" table="MyTable"> 
    ... 
    <filter name="SetMyFlag" condition="(MyFlag=:flag)"/> 
</class> 

及用途: -

session.EnableFilter("SetMyFlag").SetParameter("flag", 1); 
session.QueryOver<MyEntity>(); 

雖然我從來沒有使用與未映射列條件過濾器所以這可能不是工作!

+0

我可以問一個問題,你使用'EnableFilter'?如果是這樣的話,你不用''試試它,只用'session.EnableFilter(「SetMyFlag」)'而不用鏈接'setParameter(...)'。我很好奇這就是全部! – Rippo 2012-04-27 06:37:39