2011-01-10 14 views
6

Piszę bardzo proste zapytanie, ale z jakiegoś powodu otrzymuję zduplikowane wartości.Hibernacja, uzyskiwanie zduplikowanych wartości

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 
} 

W pi.getId() powraca powielać wartości. tj: *9,9,10,10,11,11 etc*

jednak działa to zapytanie bezpośrednio w mysql

SELECT * FROM JBPM_PROCESSINSTANCE J where J.END_ IS NULL 

nie zwróci zduplikowane wartości.

Czy ktoś może zauważyć, co jest nie tak?

+0

bez twojego mapowania trudno powiedzieć. – Matt

Odpowiedz

17

Szybkim obszarem roboczym byłoby użycie Distinct Root Entity Result Transformer.

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

Ale to tylko krycie.

Kwestionuję problem związany z mapowaniem. Jeśli jest jakaś chętna załadowana relacja 1: n z ProcessInstance do czegoś innego (nazwijmy ją X), a jest kilka (n) X dla jednej ProcessInstance, to dostaniesz kilka pozycji ProcessInstance (n) na liście wyników dla pojedynczego ProcessInstance. - Jeśli to naprawdę jest przyczyną, to to, że obejście nie jest tylko kratą roboczą, byłoby rozwiązaniem.

+0

Tak, to prawda. Zmieniliśmy mapowanie, aby uzyskać chętny. Dzięki –

+0

To nie pomogło. Nadal otrzymujemy duplikaty. Czy resultTransformer działa tylko z List()? Używamy przewijania. –

+0

Rozumiesz mnie źle: problem może się pojawić, jeśli relacja jest pobrana przez egger - zmień ją na leniwą. – Ralph

2

Łączę ten sam problem co Ty ..

Tak to rozwiązuję.

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

spowoduje to zwrócenie całego identyfikatora spełniającego wszystkie kryteria.

tam po użyciu ograniczeń In i wykonać CriteriaSpecification.DISTINCT_ROOT_ENTITY.

Będziesz mógł przewinąć wynik w 2. kryteriach. Mam nadzieję, że ta pomoc.

Powiązane problemy