sql псевдоним словаря возвращает дубликаты результатов - PullRequest
0 голосов
/ 04 мая 2011

У меня есть следующий класс

<class name="Product" table="Product">
<id name="ID" />
...
<map name="CustomFields" table="CustomFieldView">
     <key column="RECORDID" />
     <map-key column="CFName" type="String" />
     <element column="CFValue" type="String" />
</map>
</class>

и SP для выбора продукта с помощью словаря CustomFields

 <sql-query name="GetProducts">
        <return alias="p" class="Product" />
        <return-join alias="cf" property="p.CustomFields" />

        SELECT {p.*}, {cf.*}

        FROM Product p
            INNER JOIN CustomFieldView cf ON p.ID = cf.RECORDID

        // WHERE
    </sql-query>

, когда я выбираю один продукт, например WHERE ID = 1234 ,затем он работает как положено - возвращает один продукт с заполненным свойством словаря CustomFields.Но когда я выбираю не один продукт, такой как WHERE ID IN (18780, 21642) или другие критерии , тогда я получаю продукты, дублированные «CustomFields.Count» раз, например, 2 продукта, каждый из которых имеет 20 пользовательских полей, затем 40 продуктови у каждого есть 20 допустимых пользовательских полей.

Я что-то пропустил в отображении?

1 Ответ

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

Вы возвращаете Cartesian product и, следовательно, ваш продукт возвращается x раз для каждого настраиваемого поля.

Чтобы обойти эту проблему, вам нужно использовать что-то вроде: -

var query = Session
    .GetNamedQuery("GetProducts")
    .SetResultTransformer(new DistinctRootEntityResultTransformer());
    return query.List<Product>();

Обратите внимание, что вы отправите все данные по сети, и NHibernate выполнит отдельную сторону клиента-трансформера (имеется в виду веб-сервер или настольное приложение).

Я не уверен на 100%, будет ли обратное соединениебудьте заполнены, как я никогда не делал вещи таким образом, вам нужно будет проверить это.

edit Я думаю, что вы выбираете стратегию не совсем правильно.Вы действительно нуждаетесь вНе могли бы вы использовать другую стратегию, например HQL?

...