Conosci comunque come ottenere un set di risultati distinto senza utilizzare ResultTransformer quando usi SetFirstResult e SetMaxResults?
-
23-08-2019 - |
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
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