2011-01-10 33 views
6

Sto scrivendo una query molto semplice, ma sto ottenendo valori duplicati per qualche motivo.Hibernate, ottenendo valori duplicati

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 
} 

I pi.getId() restituisce valori duplicati. vale a dire: *9,9,10,10,11,11 etc*

Tuttavia, l'esecuzione questa query direttamente in mysql

SELECT * FROM JBPM_PROCESSINSTANCE J where J.END_ IS NULL 

non restituisce valori duplicati.

Qualcuno può individuare ciò che è sbagliato?

+0

senza il mapping è difficile da dire. – Matt

risposta

17

Il workarround veloce sarebbe utilizzare un trasformatore di risultato di entità distinta radice.

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

Ma questo è solo un workarround.

I ques il problema appartiene alla vostra mappatura. Se c'è una relazione 1: n caricata con piacere da ProcessInstance a qualcos'altro (chiamiamola X), e ci sono diverse (n) X per una ProcessInstance, si otterranno diversi articoli ProcessInstance (n) nell'elenco dei risultati per un singolo ProcessInstance. - Se questa è davvero la causa, allora il workarround non è solo un workarround, quindi sarebbe la soluzione.

+0

Sì, è giusto. Abbiamo cambiato la mappatura per essere impazienti. Grazie –

+0

Questo non ha aiutato. Abbiamo ancora duplicati. Il risultatoTransformer funziona solo con List()? Stiamo usando scroll. –

+0

Mi capisci male: il problema si può verificare se la relazione è stata trovata egger - cambiala in pigro. – Ralph

2

ho encouter lo stesso problema come voi ..

Ecco come ho risolto.

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

questo restituirà tutti gli ID che soddisfano tutti i criteri.

lì dopo aver utilizzato le restrizioni In ed eseguire CriteriaSpecification.DISTINCT_ROOT_ENTITY.

Sarai in grado di scorrere i risultati secondo 2 criteri .. Spero che questo aiuto.

Problemi correlati