Kennen Sie überhaupt eine Möglichkeit, eine eindeutige Ergebnismenge zu erhalten, ohne den ResultTransformer zu verwenden, wenn Sie SetFirstResult und SetMaxResults verwenden?
-
23-08-2019 - |
Frage
Wenn ich SetFirstResult und SetMaxResult verwende und die Abfrage über Verknüpfungen verfügt, weist das Ergebnis doppelte statt eindeutige Ergebnisse auf.
Dann verwende ich alle Arten von Distinct-Helfern für die Kriterien-API.Es wird jedoch nicht die gesamte Ergebnismenge gefiltert, sondern nur das ausgelagerte Ergebnis.
Wie kann ich dieses Problem lösen?
Danke
Lösung
Ich habe eine Hacky Sache, dieses Problem zu überwinden .
Die einzige „Abhilfe“ für das, dass Ich habe in der Lage gewesen, mit zu kommen ist zu Ausgabe von zwei Anfragen von den Kriterien gleiche Kriterien widersprechen. Der erste wird die ID der zweite ist, ist zu den ids contrained.
// einrichten crtieria, wie Sie wollen, einschließlich Paginierung myCriteria = doStuffToSetupCriteria (); myCriteria.setFirstResult ((page-1) * ItemsPerPage); myCriteria.setMaxResults (ItemsPerPage);
// die Liste, wenn Primärschlüssel erhalten myCriteria.setProjection (Projections.distinct (Projections.property ( "myAllias.id")); Liste ids = gacc.list ();
// jetzt die IDs in der hinzufügen Beschränkung myCriteria.add (Restrictions.in ( "myAlias.id, ids));
// reinigen von dem letzten critiera Hochlauf gacc.setProjection (null); gacc.setFirstResult (0); gacc.setMaxResults (Integer.MAX_VALUE);
// Ihre Resultate Objekte = gacc.list ()
Ein wenig hacky Ich bin damit einverstanden, aber die einzige akzeptabel soltion finde ich geben können diese limitiation.
Andere Tipps
Ich habe eine ähnliche Lösung entwickelt, aber in nur einem Ausflug zur DB:
DetachedCriteria subQuery = ...//-->Alle gewünschten Kriterien hinzufügen, einschließlich „SetFirstResult“ und „SetMaxResults“
DetachedCriteria rootQuery = DetachedCriteria.For();// wobei T eine Entität ist
subQuery.SetProjection( Projektionen.Distinct( Projections.ProjectionList().Add(Projections.Alias(Projections.Property("ID"), "ID")) ) );
// Notiz:alle meine Entities erben von einer Basisklasse, die eine Eigenschaft "ID" enthält rootQuery.Add(Subqueries.PropertyIn("ID", subQuery));
// ... dann rootQuery verwenden, um die Liste von T abzurufen, und es wird kein wiederholtes Element abgerufen.
Ich hoffe, dass jemand diese Implementierung hilfreich findet :)
Römisch