2010-12-22 2 views
3

Hallo In der Datenbank haben wir eine PRSN_ADDRESS-Tabelle, die viele Adressen hat. Einem Benutzer werden diese Adressen in einem Raster angezeigt. Die Anforderung besteht darin, zuerst die Adressen anzuzeigen, die dem Status dieses Benutzers zugeordnet sind, und dann alle anderen Status anzuzeigen.Ruhezustand Kriterienreihenfolge nach einem bestimmten Status

Zum Beispiel, die Tabelle hat 10 Datensätze mit 5 der Adressen mit Staat als Maryland, 2 von PA und 3 von NJ. Jetzt, wenn der Benutzer mit Maryland verbunden ist, müssen wir alle 10 Adressen anzeigen, aber Maryland-Adressen sollten in den ersten fünf und dann die anderen 5 in beliebiger Reihenfolge angezeigt werden.

Wir verwenden Hibernate-Kriterien. Ich habe nicht an Formeln gearbeitet und bin mir nicht sicher, ob das helfen würde, das Problem zu lösen. Es wäre toll, wenn mir jemand in die richtige Richtung zeigen könnte. Ich weis das zu schätzen.

Dank

Harish

Antwort

4

Ich bin sicher, das es ein wirklich Cleaver Weg todo dies ist aber mein erster Gedanke ist nur zwei Abfragen zu tun. Zuerst mit dem state == 'Maryland' und zweiten state != 'Maryland'. Und nähere die Ergebnisse zusammen.

Es ist möglich, mit HQL:

from Person p order by case when p.addr.state = 'Maryland' then '0' else '1' end asc, p.addr.state asc 

ich ein Beispiel über auf Github vorbereitet haben

https://github.com/gid79/q4510810-hibernate-criteria-order-by-a-specific-state

+0

Vielen Dank Gareth. Ich versuche immer noch, mithilfe der Kriterien-API eine Lösung zu erhalten. Wenn das nicht funktioniert, würde ich zu HQL wechseln, da ich HQL in der Vergangenheit nicht benutzt habe und es eine Menge Änderungen am bestehenden Code beinhaltet. Bin dankbar. – Harry

+0

In diesem Fall ist die einfachste mögliche Lösung nur zwei Abfragen durchzuführen, die Funktion wird in einer Stunde erledigt. –

0

Harish, Wenn ich es richtig verstehe, alle müssen Sie tun ist Reihenfolge zu den Kriterien hinzufügen. List addresses = sess.createCriteria(PRSN_ADDRESS.class) .addOrder(Order.asc(user.state)) .list();

+0

Dies wird jedoch nicht den Status des Benutzers als Top-Ergebnisse setzen. Es wird lediglich die Zustände des Benutzers in alphabetischer Reihenfolge darstellen. –

5

Sie durch einen bedingten Wert bestellen ...

(NHibernate Art und Weise, jemand wissen, das Äquivalent in Hibernate?)

.AddOrder(Order.Asc(
    Projections.Conditional(
     Restrictions.EqProperty("addr.state", "user.state"), Projections.Constant(0), Projections.Constant(1)))) 
.AddOrder(Order.Asc("addr.state")) 

übersetzt ...

order by 
    case when addr.state = user.state then 0 else 1 end, 
    addr.state 
+0

Joe, danke für deine Antwort, aber ich bekomme einen Compilerfehler bei Projections.Constant. Ist das richtig? – Harry

+0

Auch ich verwende Java & Hibernate und nicht nHibernate. So Projections.Conditional & Projections.Constant Compiler Fehler bei Eclipse geben. Gibt es ein Äquivalent auf Hibernare – Harry

+0

ya das ist für NHiberante ... Ich bin mir nicht sicher, wie es in Hibernate heißt. – dotjoe

Verwandte Themen