Результаты sql-запроса nhibernate отличаются от результатов прямого запроса - PullRequest
0 голосов
/ 07 декабря 2009

ОБНОВЛЕНИЕ: я ответил на мой вопрос ниже, взгляните и дайте мне знать, если у вас есть лучший способ сделать это


резюме:
при вызове функции sqlserver из SQL Management Studio я получаю список с результатами {1, 2, 3}. при вызове метода из кода, использующего NHibernate, я получаю этот список {1, 1, 1}. («1» - это целая строка результатов, а не скаляр «1») Я также попробовал это с различными наборами данных и получил то же самое поведение.

длинная история:
У меня есть функция sql на сервере sql, называемая GetHistory (itemId). он возвращает таблицу с результатами. когда я запрашиваю из SQL Management Studio, я получаю список результатов. Я запрашиваю, вызывая функцию так:

select * from GetHistory(10001)

в моей заданной БД это приводит к 3 строкам. каждая строка имеет время, тип и описание.
в NHibernate я специально создал для этого новую сущность, поскольку такой органической таблицы / сущности нет. поэтому у меня есть отображение:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
 namespace="myNamespace" assembly="myAssembly">
 <class name="HistoryEvent">
 <id name="id" type="long" access="field">
  <column name="Id"/>
  <generator class="native"/>
 </id>
 <property name="type" column="Type" type="short" access="field"/>
 <property name="time" column="Time" type="datetime" access="field"/>
 <property name="description" column="Description" type="string" access="field"/>
</class>

<sql-query name='GetHistory'>
    <return class='HistoryEvent, myAssembly' alias='historyEvent'/>
 <![CDATA[SELECT * FROM GetHistory(:id)]]>
</sql-query>
</hibernate-mapping>

бизнес-объект выглядит так:

 public class HistoryEvent
 {
     private long id;
  private short type;
  private string description;
  private DateTime time;
        ... here be properties with public getter etc...
    }

и, наконец, я вызываю эту функцию из своего кода следующим образом:

IList result = s.GetNamedQuery("GetHistory").SetInt64("id", id).List();

при проверке этого списка с помощью отладчика я получаю 3 объекта, которые являются одной строкой 3 раза. Я также пытался использовать запрос напрямую из NHibernate (используя sql-запрос) вместо того, чтобы выполнять функцию DB, но получил те же результаты.
моя интуиция заключается в том, что что-то не так с моим отображением или что-то не так с NHibernate :)
HELP!

1 Ответ

0 голосов
/ 07 декабря 2009

хорошо, вскоре после того, как я опубликовал вопрос, я понял это.
Написание всего этого действительно помогло мне, я думаю. это была проблема:
столбец Id, который я использовал, не был уникальным. это идентификатор, просто не правильный идентификатор для запроса. это почему? потому что мой запрос возвращает объединение трех запросов из трех разных таблиц, и возвращенный идентификатор был фактически ItemId (тот же самый, который был передан функции!)

так что теперь я должен был иметь уникальный идентификатор. Я кратко попытался использовать тег составного идентификатора NHibernate вместо идентификатора - но, столкнувшись с трудностями, я решил не тратить больше времени на автоматические вещи и возвращать идентификаторы из запроса.

Обнаружив, что я не могу использовать SELECT IDENTITY () INTO ... внутри функций с табличной переменной, я рассмотрел RAND на секунду и в конечном итоге использовал ROW_NUMBER () OVER (SORT BY blah) для генерации моих поддельных идентификаторов. на данный момент это работает довольно хорошо, хотя этот код не выиграл бы конкурс красоты.
PS: есть предложения по лучшему способу создания идентификатора? или вы когда-нибудь работали с композитным идентификатором? дай мне знать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...