2011-07-06 18 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でconcatの文字列 –

+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条件を追加する必要があります。

は次のように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=2 and reword_faq='#SOME_FAQ' 

ように書き換えることができた?:

SELECT (reword || reword_faq) as foo 
FROM me_review_entries re 
WHERE (reword || reword_faq) = '2#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

ありがとうございます。最後に私は2つの部分に分割された情報を持っていたので、最初の解決策を実行しました(コード内で前に.Split( '#')を実行しなければなりませんでした)。しかし、これは面白いですが、試していないので正しいとは言えません。しかし、私は+ +1 –

+0

あなたがそれを試してみたら、それ以上の情報を必要とし、うまくいけば正しいとマークしてください。 –

関連する問題