NHibernate Wie verschiedene Objekte wählen, basierend auf bestimmten Eigenschaft mit HQL?

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

  •  05-07-2019
  •  | 
  •  

Frage

Wie kann HQL verwendet werden, um bestimmte Objekte auswählen, die bestimmten Kriterien erfüllen?

Wir haben das versucht, im Anschluss an eine Liste der Top-Ten-abonnierten RSS-Feeds zu erzeugen (wo SubscriptionCount eine abgeleitete Eigenschaft ist):

var topTen = UoW.Session.CreateQuery( @"SELECT distinct rss 
                                                 FROM RssFeedSubscription rss
                                                 group by rss.FeedUrl
                                                 order by rss.SubscriptionCount DESC
                                                 ")
.SetMaxResults(10)
.List<RssFeedSubscription>();

Wo die Absicht ist, nur der zwei einzigartigen Feed-URLs in der Datenbank zu wählen, anstatt die zehn Zeilen die Datenbank als Objekte instanziert int. Das Ergebnis der oben ist:

Column 'RssSubscriptions.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

Es ist möglich, nur ausdünnen die Ergebnisse so, dass wir den zwei einzigartigen Feed-URLs herausnehmen, nachdem wir die Daten wieder aus der Datenbank zu erhalten, aber es muss eine Möglichkeit, dies mit HQL auf der DB-Ebene zu tun?

EDIT: Wir erkennen, dass es möglich ist, eine Scalar Abfrage zu tun und dann manuell Werte herausziehen, aber gibt es nicht eine Möglichkeit, einfach ein Spiel Kriterien festlegt Objekte gezogen zurück

?
War es hilfreich?

Lösung

Wenn Sie Ihr HQL ein wenig ändern, so aussehen:

var topTen = UoW.Session.CreateQuery( @"SELECT distinct rss.FeedUrl
                                          FROM RssFeedSubscription rss
                                          group by rss.FeedUrl
                                          order by rss.SubscriptionCount DESC
                                        ")
.SetMaxResults(10)
.List();

die topten Variable wird ein Gegenstand [] mit 2 Elementen sein, da den 2-Feed URLs zu sein.

können Sie haben dies als stark typisierte Auflistung zurückgegeben, wenn Sie die SetResultTransformer () -Methode des IQuery interfase verwenden.

Andere Tipps

Sie benötigen einen skalaren Abfrage auszuführen. Hier ist ein Beispiel aus der NHibernate docs:

IEnumerable results = sess.Enumerable(
    "select cat.Color, min(cat.Birthdate), count(cat) from Cat cat " +
    "group by cat.Color"
);
foreach ( object[] row in results )
{
    Color type = (Color) row[0];
    DateTime oldest = (DateTime) row[1];
    int count = (int) row[2];
    .....
}

Es ist die group by rss.FeedUrl, dass Sie das Problem verursacht. Es sieht nicht so aus, wie Sie es brauchen, da Sie die Objekte selbst sind auswählen. Entfernen Sie das, und ich denke, Sie werden gut sein.

EDIT - Ich entschuldige mich Ich habe nicht den Teil bemerken über die „abgeleitete Eigenschaft“. Damit ich nehme an, Sie meinen, es ist keine Hibernate-mapped Eigenschaft und ist somit nicht wirklich eine Spalte in der Tabelle hat? Das würde erklären, die zweite Fehlermeldung, die Sie in Ihrer Anfrage erhalten. Möglicherweise müssen Sie die „order by“ -Klausel sowie entfernen und Ihre Sortierung in Java tun, wenn das der Fall ist.

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