Спящий режим, получение повторяющихся значений

Я пишу очень простой запрос, но по какой-то причине получаю повторяющиеся значения.

Criteria cr = session.createCriteria(ProcessInstance.class, "p")
        .add(Restrictions.isNull("end"));
@Cleanup ScrollableResults sr = cr.scroll(ScrollMode.FORWARD_ONLY);

while (sr.next()) {
    pi = (ProcessInstance) sr.get(0);
    String id = pi.getId(); //Getting duplicate values
}

pi.getId() возвращает повторяющиеся значения. то есть: *9,9,10,10,11,11 etc*

Однако запуск этого запроса непосредственно в mysql

SELECT * FROM JBPM_PROCESSINSTANCE J where J.END_ IS NULL

Не возвращает повторяющиеся значения.

Кто-нибудь может определить, что не так?


person Shervin Asgari    schedule 10.01.2011    source источник
comment
без вашей карты трудно сказать.   -  person Matt    schedule 03.08.2012


Ответы (2)


Быстрым обходным решением было бы использование преобразователя результатов Distinct Root Entity Result.

...
crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
List unique = crit.List();
...

Но это только обходной путь.

Я ques проблема относится к вашему отображению. Если существует какое-либо нетерпеливо загруженное отношение 1:n от ProcessInstance к чему-то другому (назовем это X), и существует несколько (n) X для одного ProcessInstance, вы получите несколько элементов ProcessInstance (n) в списке результатов для одного Экземпляр процесса. -- Если это действительно причина, то обходной путь - это не просто обходной путь, тогда это будет решением.

person Ralph    schedule 10.01.2011
comment
Да, это правильно. Мы изменили отображение, чтобы быть готовыми к выборке. Спасибо - person Shervin Asgari; 10.01.2011
comment
Это не помогло. Мы по-прежнему получаем дубликаты. Работает ли resultTransformer только со List()? Мы используем прокрутку. - person Shervin Asgari; 10.01.2011
comment
Вы меня неправильно понимаете: проблема может возникнуть, если отношение IS fetched egger - измените его на lazy. - person Ralph; 10.01.2011
comment
Я не могу изменить его на ленивый. Должно быть, мы нетерпеливы из-за другой ошибки в jbpm/seam. Есть ли другой обходной путь? Я также могу сообщить, что ваше решение работало с использованием list(). Однако я ищу решение, используя scroll - person Shervin Asgari; 10.01.2011
comment
В этом случае преобразование результатов - единственное известное мне решение - но сначала нужно загрузить все сущности, и поэтому прокрутка не работает. - person Ralph; 10.01.2011
comment
Единственный хак, который я знаю, чтобы реализовать прокрутку, как вам нужно, - это получить только идентификаторы с первым запросом, используя DISTINCT_ROOT_ENTITY, а затем загрузить реальные сущности со вторым прокручиваемым запросом по его идентификатору. Но если это увеличение, ваша производительность сильно зависит от ваш вариант использования. - person Ralph; 10.01.2011
comment
У меня такая же проблема, но это решение мне не помогает. stackoverflow.com/ вопросы/33127626/ - person gstackoverflow; 14.10.2015

Я столкнулся с той же проблемой, что и вы..

Вот как я это решаю.

Criteria cr = session.createCriteria(ProcessInstance.class, "p")
        .add(Restrictions.isNull("end")).setProjection("id")

это вернет все идентификаторы, которые удовлетворяют всем вашим критериям.

там после того, как вы используете In ограничения и выполняете CriteriaSpecification.DISTINCT_ROOT_ENTITY.

Вы сможете прокрутить свой результат по 2-м критериям. Надеюсь, это поможет.

person seesee    schedule 03.08.2012