Wenn Sie eine Projektion zu einem NHibernate-Kriterium hinzufügen, wird die standardmäßige Entitätsauswahl nicht mehr ausgeführt

8

Ich schreibe ein NHibernate-Kriterium, das Daten auswählt, die Paging unterstützen. Ich verwende den COUNT(*) OVER() -Ausdruck von SQL Server 2005 (+), um die Gesamtzahl der verfügbaren Zeilen zu erhalten, als beantwortet von Ayende Rahien. Ich brauche diese Zahl, um berechnen zu können, wie viele Seiten es insgesamt gibt. Das Schöne an dieser Lösung ist, dass ich keine zweite Abfrage ausführen muss, um die Zeilenanzahl zu erhalten.

Ich kann jedoch anscheinend keine Arbeitskriterien schreiben (Ayende stellt nur eine HQL-Abfrage zur Verfügung).

Hier ist eine SQL-Abfrage, die zeigt, was ich will und es funktioniert gut. Beachten Sie, dass ich absichtlich die eigentliche Paging-Logik weggelassen habe, um auf das Problem zu fokussieren:

%Vor%

Hier ist der HQL:

%Vor%

Beachten Sie, dass die Funktion rowcount() in einem benutzerdefinierten NHibernate-Dialekt registriert ist und in SQL in COUNT(*) OVER() aufgelöst wird.

Voraussetzung ist, dass die Abfrage anhand eines Kriteriums ausgedrückt wird. Leider weiß ich nicht, wie ich es richtig machen soll:

%Vor%

Immer wenn ich eine Projektion hinzufüge, wählt NHibernate nicht item (wie es ohne eine Projektion der Fall wäre), sondern nur rowcount() , während ich wirklich beides brauche. Außerdem kann ich nicht item als Ganzes projizieren, nur die Eigenschaften und ich möchte wirklich nicht alle auflisten.

Ich hoffe, dass jemand eine Lösung dafür hat. Danke trotzdem.

    
Sandor Drieënhuizen 29.10.2009, 16:02
quelle

6 Antworten

5

Ich denke, es ist in Kriterien nicht möglich, es hat einige Grenzen.

Sie können die ID abrufen und Elemente in einer nachfolgenden Abfrage laden:

%Vor%

Wenn Sie es nicht mögen, verwenden Sie HQL, Sie können dort auch die maximale Anzahl von Ergebnissen festlegen:

%Vor%     
Stefan Steinegger 10.11.2009, 14:08
quelle
0

Verwenden Sie CreateMultiCriteria.

Sie können 2 einfache Anweisungen mit nur einem Treffer in der DB auf diese Weise ausführen.

    
dmonlord 01.11.2009 16:45
quelle
0

Ich frage mich, warum die Verwendung von Kriterien eine Voraussetzung ist. Können Sie session.CreateSQLQuery nicht verwenden? Wenn Sie es wirklich in einer Abfrage tun müssen, hätte ich vorgeschlagen, die Objektobjekte und die Anzahl zurückzunehmen, wie:

%Vor%

... auf diese Weise können Sie Objektobjekte aus Ihrer Abfrage zusammen mit der Anzahl abrufen. Wenn bei der Zwischenspeicherung von Hibernate ein Problem auftritt, können Sie auch die einer systemeigenen Abfrage zugeordneten Abfrageräume (Entitäts- / Tabellencaches) konfigurieren, so dass veraltete Abfragecache-Einträge automatisch gelöscht werden.

    
RMorrisey 02.11.2009 23:50
quelle
0

Wenn ich Ihre Frage richtig verstehe, habe ich eine Lösung. Ich habe mit dem gleichen Problem ziemlich gerungen.

Lassen Sie mich schnell das Problem beschreiben, das ich hatte, um sicherzustellen, dass wir auf der gleichen Seite sind. Mein Problem kam zum Blättern. Ich möchte 10 Datensätze in der Benutzeroberfläche anzeigen, aber ich möchte auch die Gesamtzahl Anzahl von Datensätzen kennen, die den Filterkriterien entsprechen. Ich wollte dies mit der NH-Kriterien-API erreichen, aber als ich eine Projektion für die Zeilenanzahl hinzufügte, funktionierte meine Abfrage nicht mehr, und ich würde keine Ergebnisse erhalten (ich erinnere mich nicht an den spezifischen Fehler, aber es klingt wie du) werde wieder).

Hier ist meine Lösung (Kopieren und Einfügen aus meinem aktuellen Produktionscode). Beachten Sie, dass "SessionError" der Name der Geschäftsentität ist, für die ich ausgelagerte Daten nach 3 Filterkriterien abrufe: IsDev, IsRead und IsResolved.

%Vor%

Also erstelle ich meine Basiskriterien mit optionalen Einschränkungen. Dann klicke ich es und füge eine Zeilenanzahl-Projektion zu den CLONED-Kriterien hinzu. Beachten Sie, dass ich klonen, bevor ich die Paging-Einschränkungen hinzufüge. Dann richte ich einen IMultiCriteria ein, um die ursprünglichen und geklonten ICriteria-Objekte zu enthalten, und verwende den IMultiCriteria, um beide auszuführen. Jetzt habe ich meine Daten aus dem ursprünglichen ICriteria ausgelagert (und ich habe nur die Daten gezogen, die ich über den Draht brauche), und auch eine rohe Zählung, wie viele tatsächliche Datensätze meinen Kriterien entsprachen (nützlich zum Anzeigen oder Erstellen von Paging-Links oder was auch immer). Diese Strategie hat für mich gut funktioniert. Ich hoffe, das ist hilfreich.

    
Samuel Meacham 10.11.2009 19:53
quelle
0

Ich würde vorschlagen, benutzerdefinierte Ergebnistransformer zu untersuchen, indem Sie SetResultTransformer () für Ihre Sitzung aufrufen.

    
Rashack 18.11.2009 13:46
quelle
0

Erstellen Sie eine Formeleigenschaft in der Klassenzuordnung:

%Vor%     
João Taborda 09.04.2010 14:56
quelle