我想用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
我对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条件以使其工作。
另一个选项是注册一个CustomSQLFunction。
RegisterFunction("concat",
new SQLFunctionTemplate(NHibernateUtil.String, "(?1 || ?2)"));
在NHibernate中注册定制SQL函数
var results = session.CreateQuery("select concat(reword,rewordfaq)
from Reword
where concat(reword,rewordfaq)='2#SOME_FAQ'
").List();