Hibernate, получение повторяющихся значений - PullRequest
6 голосов
/ 10 января 2011

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

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

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

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

Ответы [ 2 ]

17 голосов
/ 10 января 2011

Быстрый обходной путь - использование преобразователя результатов для отдельного корневого объекта.

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

Но это всего лишь обходной путь.

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

2 голосов
/ 03 августа 2012

Я допускаю ту же проблему, что и вы ..

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

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

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

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

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

...