powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate: как сделать мапинг на основе нативного SQL-запроса
8 сообщений из 8, страница 1 из 1
NHibernate: как сделать мапинг на основе нативного SQL-запроса
    #37300485
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь делать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain" assembly="Domain">
  <class name="BookInfo" table="Books">
    <id name="ID" unsaved-value="0">
      <column name="ID" not-null="true" />
        <generator class="identity"/>
    </id>
    
    <property name="ISBN" />
    <property name="Title" />
    <property name="IdTheme" column="Id_Theme"/>
    <property insert="false" update="false" name="Theme" column="Theme" />
    <loader query-ref="sql"/>
        
  </class>

  <sql-query name="sql">
    select b.*, t.name as Theme from books as b, theme as t where b.id_theme = t.id    
  </sql-query>
</hibernate-mapping>

Необработанное исключение: System.ArgumentException: No positional parameters in
query: select b.*, t.name as Theme from books as b, theme as t where b.id_theme = t.id

как это можно сделать? спасибо
...
Рейтинг: 0 / 0
NHibernate: как сделать мапинг на основе нативного SQL-запроса
    #37300920
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmaw,

не буду говорить со всей определённостью, но думаю вам надо написать как-то так:
Код: plaintext
1.
2.
  <sql-query name="sql">
    select b.*, t.name as Theme from books as b, theme as t where b.id_theme = t.id and b.ID = ?
  </sql-query>
NHibernate надо ведь как-то передать id книги, и делает он это позиционными параметрами.

PS. А зачем вам это надо? Боюсь много проблем принесёт. Почему стандартные средства NH не использовать?
...
Рейтинг: 0 / 0
NHibernate: как сделать мапинг на основе нативного SQL-запроса
    #37301306
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

стандартные средства я пока не знаю. изучаю (эмпирически) NHibernate - отрабатываю интересные для меня сценарии использования. Вот так вроде получилось:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain" assembly="Domain">
  <class name="BookInfo" table="Books">
    <id name="ID" unsaved-value="0">
      <column name="ID" not-null="true" />
        <generator class="identity"/>
    </id>
    
    <property name="ISBN" />
    <property name="Title" />
    <property name="IdTheme" column="Id_Theme"/>
    <property insert="false" update="false" name="Theme" column="Theme" />
    <loader query-ref="loadBooks"/>
    
    
  </class>

  <sql-query name="loadBooks" callable="true">
    <return alias="bi" class="BookInfo" />
    <![CDATA[select bi.id as {bi.ID}, 
        bi.title as {bi.Title}, 
        bi.isbn as {bi.ISBN}, 
        bi.id_theme as {bi.IdTheme}, 
        t.name as {bi.Theme} 
    from books as bi, theme as t 
    where bi.id_theme = t.id and bi.id=:id]]> 
  </sql-query>
</hibernate-mapping>

но теперь не работает

Код: plaintext
1.
ICriteria criteria = session.CreateCriteria(typeof(BookInfo));
list = criteria.List<BookInfo>();

т.е. весь спиок как теперь выбрать? для обычного (насколько я, как новичек, успел вкурить) мапинга это работало.

А вообще цель такая. Есть ситуации, когда
1. для некоторых запросов я не хочу использовать полное отображение связанных объектов - это могут быть не просто справочники "id - name", а таблицы с кучей полей, из которых мне надо пару-тройку полей. Хочу чтобы в классе были только ID-шники и эти самые поля (только для чтения)
2. хочу чтобы я сам дал БД sql запроса - он может быть сложным
3. а вот insert/update типовой - поэтому пусть мапится объект на таблицу

или др. словами - для чтения из БД и отображения на UI использовать вьюху, а для записи - таблицу/процедуру (до процедуры пока не добрался). как-то так
...
Рейтинг: 0 / 0
NHibernate: как сделать мапинг на основе нативного SQL-запроса
    #37301734
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmaw,

этот велосипед уже изобрели. И называется он проекции.
Для начала можно почитать здесь , здесь и здесь (уделите внимание select new()). И гугл тоже никто не отменял.

А родного SQL старайтесь избегать.
...
Рейтинг: 0 / 0
NHibernate: как сделать мапинг на основе нативного SQL-запроса
    #37303278
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

Про проекции вреде разобрался, очень поверхностно. Но все равно вопрос остался - что я не так делал в приведённом мной примере, почему он не разрешает выбрать все строки (я подозреваю, что там параметр :id теперь это не дает сделать, но без него тоже ошибка)?
...
Рейтинг: 0 / 0
NHibernate: как сделать мапинг на основе нативного SQL-запроса
    #37303283
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"А родного SQL старайтесь избегать"

как не старайся, а все равно найдется пара-тройка мест (?), где без него тяжко придется. так вот я и хочу, так сказать, подстраховаться. тем более, что NH это позволяет (как про него написано)
...
Рейтинг: 0 / 0
NHibernate: как сделать мапинг на основе нативного SQL-запроса
    #37303392
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем не подошел AliasToBeanResultTransformer / IResultTransformer?
...
Рейтинг: 0 / 0
NHibernate: как сделать мапинг на основе нативного SQL-запроса
    #37303621
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawSolYUtor,

Про проекции вреде разобрался, очень поверхностно. Но все равно вопрос остался - что я не так делал в приведённом мной примере, почему он не разрешает выбрать все строки (я подозреваю, что там параметр :id теперь это не дает сделать, но без него тоже ошибка)?
Такова плата за использование SQL для загрузки, поскольку вы отгораживаетесь от структуры таблиц. Как по-вашему NHibernate должен догадаться, как ему изменить ваш запрос для загрузки списка объектов? Шаманить не умеет.
Два правильных способа делать выборки: проекции и IResultTransformer.

Попытка часть грузить entity через loader query-ref носит ректальный характер, а потому болезненна.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate: как сделать мапинг на основе нативного SQL-запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]