Hibernate, получая дубликаты ценностей
-
09-10-2019 - |
Вопрос
Я пишу очень простой запрос, но я получаю дублирующие значения по какой-то причине.
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()
Возвращает дублирующие значения. IE: *9,9,10,10,11,11 etc*
Однако запуск этого запроса непосредственно в MySQL
SELECT * FROM JBPM_PROCESSINSTANCE J where J.END_ IS NULL
Не возвращает дублирующие значения.
Может ли кто-нибудь место, что не так?
Решение
Быстрое Workaround будет использоваться отдельный трансформатор результата корневого объекта.
...
crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
List unique = crit.List();
...
Но это только Workaround.
Я проверяю проблему к вашему отображению. Если есть какие-либо нетерпение, загруженные 1: N отношений от процессанстанта на что-то другое (вызовите его X), и есть несколько (n) x для одного процессора, то вы получите несколько элементов процессора (N) в списке результатов для одного ProcessIntance. - Если это реально причина, чем Workaround - это не просто для работы, то это будет решение.
Другие советы
Я начнут ту же проблему, что и вы ..
Вот как я решаю это.
Criteria cr = session.createCriteria(ProcessInstance.class, "p")
.add(Restrictions.isNull("end")).setProjection("id")
Это вернет весь идентификатор, который удовлетворяет всем вашим критериям.
Там после использования In
Ограничения и выступление CriteriaSpecification.DISTINCT_ROOT_ENTITY
.
Вы сможете прокрутить свой результат в 2-го критериях. Я надеюсь, что эта помощь.