2011-07-06 52 views
0

我想用複製此查詢與NHibernate投影如何用NHibernate建立字符串查詢?

SELECT ('reword#' || reword) || reword_faq as foo FROM me_review_entries re 
WHERE ('reword#' || reword) || reword_faq = 'reword#2#SOME_FAQ' 

我做

Session.CreateCriteria<Reword> 

但是當時我不知道我可以做投影打造的字符串('reword#' || reword) || reword_faq

任何想法?

+0

||是有效的SQL? – Peter

+0

我在postGreSQL中將它用於連接字符串 –

+0

對不起,但我認爲你在這裏遇到了原生的' Rippo

回答

1

我根本不熟悉postGreSQL,但希望這可能接近你所需要的。

var results = session.CreateCriteria<Reword>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("reword"), "reword") 
     .Add(Projections.Property("faq"), "faq") 
    ) 
    .Add(Restrictions.Eq("reword","2")) 
    .Add(Restrictions.Eq("faq","SOME_FAQ")) 
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(ReWordDTO))) 
    .List<ReWordDTO>(); 

然後,如果需要,您可以將來自DTO的列輸出代碼以進行輸出。您可能需要添加一些OR條件才能使其在Criteria中工作。

應該產生這樣的SQL:

select Reword, Reword_faq 
from me_review_entries 
where reword=2 
and reword_faq='SOME_FAQ' 

它類似於原來的查詢,可能是接近你在找什麼。我不確定你需要連接你的where子句中的列,因爲你已經分開了值。

您的原始:

SELECT ('reword#' || reword) || reword_faq as foo FROM me_review_entries re 
WHERE ('reword#' || reword) || reword_faq = 'reword#2#SOME_FAQ' 

難道被改寫爲?:

SELECT (reword || reword_faq) as foo 
FROM me_review_entries re 
WHERE (reword || reword_faq) = '2#SOME_FAQ' 

這可以被重新寫爲?:

SELECT (reword || reword_faq) as foo 
FROM me_review_entries re 
WHERE reword=2 and reword_faq='#SOME_FAQ' 

雖然數據在列中可能意味着它需要按照您描述的方式進行書寫。如果情況確實如此,您可以在條件查詢中添加一些OR條件以使其工作。

另一種選擇是註冊一個CustomSQLFunction。

RegisterFunction("concat", 
    new SQLFunctionTemplate(NHibernateUtil.String, "(?1 || ?2)")); 

Registering Custom SQL Functions in NHibernate

var results = session.CreateQuery("select concat(reword,rewordfaq) 
    from Reword 
    where concat(reword,rewordfaq)='2#SOME_FAQ' 
").List(); 
+0

謝謝。最後,我做了第一個解決方案(我必須在代碼中分割('#')),因爲我將信息分成兩部分。但這很有趣,但我不能將其標記爲正確的,因爲我沒有嘗試。但我加+1 –

+0

評論,如果你需要任何進一步的信息,並希望標記爲正確的,一旦你已經嘗試了。 –