如何用NHibernate构建字符串查询?

时间:2011-07-06 09:46:05

标签: sql nhibernate postgresql nhibernate-projections

我想使用投影

使用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

任何想法?

1 个答案:

答案 0 :(得分: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();