1

プロジェクションを使用して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

何か案が ?

4

1 に答える 1

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 の列を連結できます。Criteria で機能させるには、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 || 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 条件を基準クエリに追加して機能させることができます。

もう 1 つのオプションは、CustomSQLFunction を登録することです。

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

カスタム SQL 関数を Hibernate に登録する

var results = session.CreateQuery("select concat(reword,rewordfaq) 
  from Reword
  where concat(reword,rewordfaq)='2#SOME_FAQ'
").List();
于 2011-07-06T10:46:43.933 に答える