NHibernate проблема выбора между CreateSql и CreateCriteria - PullRequest
0 голосов
/ 26 мая 2011

У меня очень глупое сомнение в NHibernate.Есть два или три объекта, два из которых связаны, а один не связан с двумя другими объектами.Я должен получить некоторые выбранные столбцы из этих трех таблиц, присоединившись к ним.Это хорошая идея, чтобы использовать session.CreateSql () или мы должны использовать session.CreateCriteria ().Я действительно запутался здесь, так как не мог написать здесь запросы Criteria и был вынужден использовать CreateSql.Пожалуйста, сообщите.

Ответы [ 2 ]

0 голосов
/ 26 мая 2011

Есть несколько способов сделать запросы с NH.

  • HQL , классический способ, мощный объектно-ориентированный язык запросов. Недостаток: появляется в строках кода (фактически: редактор не поддерживается).
  • Критерии , классический способ создания динамических запросов без манипуляций со строками. Недостатки: не такой мощный, как HQL, и не такой безопасный, как его преемники.
  • QueryOver , преемник Criteria, который имеет более приятный синтаксис и более безопасен для типов.
  • LINQ , теперь основанный на HQL, более интегрирован, чем HQL, безопасен для типов и, как правило, зависит от вкуса.
  • SQL как запасной вариант для случаев, когда вам нужно что-то, что вы не можете получить объектно-ориентированным способом.

Я бы порекомендовал HQL или LINQ для обычных запросов, QueryOver (соответственно критерии) для динамических запросов и SQL, только если нет другого способа.

Чтобы ответить на вашу конкретную проблему, которую я не знаю: если вся информация, необходимая для запроса, доступна в объектно-ориентированной модели, вы сможете решить ее с помощью HQL .

0 голосов
/ 26 мая 2011

в общем случае, по возможности, следует избегать написания SQL;
одно из преимуществ использования ORM заключается в том, что он не зависит от реализации.
это означает, что вы не знаете (и не заботитесь) о том, чтобазовая база данных есть, и вы действительно можете легко переключать поставщиков БД или настраивать структуру БД.
Если вы пишете свои собственные операторы SQL, вы рискуете, что они не будут работать с другими поставщиками, а также вам придется поддерживать ихсамостоятельно (например, если вы измените имя нижележащего столбца для свойства Id с «Id» на «Employee_Id», вам придется изменить ваш SQL-запрос, в то время как с критериями никаких изменений не потребуется).

Сказав это, ничто не мешает вам написать Criteria / HQL, который извлекает данные из более чем одной таблицы.например (с HQL):

select emp.Id, dep.Name, po.Id  
from Employee emp, Department dep, Posts po
where emp.Name like 'snake' //etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...