Как построить строковый запрос с помощью NHibernate? - PullRequest
1 голос
/ 06 июля 2011

Я хотел бы воспроизвести этот запрос с помощью 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 Ответ

1 голос
/ 06 июля 2011

Я совсем не знаком с 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 в коде для вывода.Вам может потребоваться добавить некоторые условия ИЛИ, чтобы он работал в Критериях.

Должен производить 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)"));

Регистрация пользовательского SQLФункции в NHibernate

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