Kennen Sie überhaupt eine Möglichkeit, eine eindeutige Ergebnismenge zu erhalten, ohne den ResultTransformer zu verwenden, wenn Sie SetFirstResult und SetMaxResults verwenden?

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

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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top