Дублирующиеся строки из запроса HQL при возврате свойства Bag - PullRequest
2 голосов
/ 24 февраля 2011

В своем запросе я использую несколько таблиц, некоторые из которых не могут быть установлены как обычные отношения nhibernate, поэтому я вынужден возвращать строки, состоящие из отдельных столбцов, а не экземпляров сущностей.Одним из свойств, которое я хочу вернуть, является сумка / список, и мой запрос выглядит примерно так:

select p.ID, p.SomeOtherField, elements(p.MappedBagField), o.AnotherField ... from Parent p, OtherClass o, ...

Запрос работает, но проблема, с которой я сталкиваюсь, заключается в том, что я получаюназад несколько рядов, когда пакет содержит более одной связанной записи.Есть ли простой способ предотвратить это?Я пытался отличный p.ID , но это не имело никакого значения

[Править] Будет ли API Criteria более подходящим для этого? [/ Править]

Ответы [ 3 ]

3 голосов
/ 25 февраля 2011

Похоже, вы просто пытаетесь получить список родителей с загруженной коллекцией, а также некоторые данные из другого объекта, это правильно?

В этом случае:

var parents = session.CreateQuery(@"
    select p, o
    from Parent p, OtherClass o
    join fetch p.MappedBagField
    ...")
    .SetResultTransformer(Transformers.DistinctRootEntity)
    .List<object[]>();

Каждый элемент результата состоит из двух элементов, [0] - это родительский элемент, [1] - это другой класс.

0 голосов
/ 26 июня 2013

Вместо отдельного p.ID используйте DISTINCT p (без поля .ID )

У меня была такая же проблема с дублирующимися строками результатов. Это решило мою проблему:

session.CreateQuery(
  "SELECT DISTINCT p, o
   FROM ParentClass AS p,
        OtherClass AS o
   INNER JOIN p.mappedBagField as bagField
   WHERE ...
   AND bagField.id IN (:interestingIds)")
.setParameterList("interestingIds", {1,2,3,4});
.list();

Пояснение:

ParentClass и OtherClass - это два отдельных класса с отношением no (hibernate mapped).

ParentClass.mappedBagField - это коллекция для третьего отображенного класса гибернации.

В приведенном выше примере я ищу строки с интересноIds 1, 2, 3 и 4.

Если в наборе данных ParentClass есть две записи mappedBagField с идентификаторами 2 и 4, то (оригинальный) SELECT дважды будет соответствовать вышеуказанным interrestingIds !

Это приводит к двум строкам.

При добавлении DISTINCT p к SELECT пропускаются повторяющиеся результаты: каждая строка будет отображаться только один раз (даже при наличии нескольких интересноId хитов).

0 голосов
/ 28 февраля 2011

Это семантика Bag. Сумка позволяет дублировать сущности. Вместо использования Bag (List), попробуйте использовать Set (ISet). Тогда NHibernate обычно должен отфильтровывать дубликаты.

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