Conosci comunque come ottenere un set di risultati distinto senza utilizzare ResultTransformer quando usi SetFirstResult e SetMaxResults?

StackOverflow https://stackoverflow.com/questions/545940

Domanda

Quando utilizzo SetFirstResult e SetMaxResult e se la query ha join, il risultato ha risultati duplicati anziché univoci.

Quindi utilizzo tutti i tipi di aiutanti distinti per i criteri API.Ma non filtra l'intero set di risultati, filtra solo il risultato della pagina.

Come posso superare questo problema?

Grazie

È stato utile?

Soluzione

Ho trovato un cosa hacky per superare questo problema.

  

L'unica "soluzione" per questo che   Sono stato in grado di venire in mente è a   emettere due query dai criteri   stessi criteri oggetto. Il primo   ottiene l'id è il secondo è   contrained agli ID.

     

// imposta crtieria come si desidera,   compresi paginazione Mycriteria =   doStuffToSetupCriteria ();   myCriteria.setFirstResult ((Pagina-1) * itemsPerPage);   myCriteria.setMaxResults (itemsPerPage);

     

// ottenere l'elenco, se le chiavi primarie   myCriteria.setProjection (Projections.distinct (Projections.property ( "myAllias.id"));   Elenco ids = gacc.list ();

     

// ora aggiungere l'ID di in   restrizione   myCriteria.add (Restrictions.in ( "myAlias.id,   id));

     

// ripulire dall'ultima corsa critiera   gacc.setProjection (null);   gacc.setFirstResult (0);   gacc.setMaxResults (Integer.MAX_VALUE);

     

// tua lista risultati oggetti =   gacc.list ()

     

Un po 'hacky Sono d'accordo, ma l'unica   soltion accettabile che ho trovato data   questo limitiation.

Altri suggerimenti

Ho creato una soluzione simile ma in un solo viaggio in DB:

DetachedCriteria subQuery = ...//-->Aggiungi tutti i criteri desiderati e inclusi "SetFirstResult" e "SetMaxResults"

DetachedCriteria rootQuery = DetachedCriteria.For();// dove T è un'entità

subQuery.SetProiezione( Proiections.distinct (proiections.ProjectList (). Aggiungi (proiections.alias (proiections.property ("id"), "id"))) );

// Nota:Tutte le mie entità ereditano da una classe base che contiene una proprietà "ID" rootQuery.add (subqueries.propertyin ("id", sottoquery));

// ... quindi utilizzare rootQuery per ottenere l'elenco di T e non verrà recuperato alcun elemento ripetuto.

Spero che qualcuno trovi utile questa implementazione :)

Romano

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top