2011-01-10 3 views
6

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

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 

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

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

+0

без вашего картографирования трудно сказать. – Matt

ответ

17

Быстродействующий рабочий стол должен был использовать отличительный трансформатор преобразования корневого объекта.

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

Но это только рабочий стол.

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

+0

Да, это правильно. Мы изменили отображение, чтобы получить выбор. Спасибо –

+0

Это не помогло. Мы по-прежнему получаем дубликаты. Имеет ли resultTransformer работу только с List()? Мы используем свиток. –

+0

Вы понимаете меня неправильно: проблема может возникнуть, если отношение IS выбрано egger - измените его на ленивый. – Ralph

2

Я encouter такая же проблема, как вы ..

Это, как я решить.

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

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

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

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