如何使用HQL选择符合特定条件的特定对象?

我们尝试了以下方法来生成十大订阅RSS源列表(其中SubscriptionCount是派生属性):

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

其中的目的只是选择数据库中的两个唯一的feed URL,而不是将数据库实例化为对象的十行int。以上结果是:

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.

我们可以简化结果,以便在从数据库中获取数据后取出两个唯一的源URL,但必须有一种方法可以使用HQL在数据库级别执行此操作吗?

编辑:我们意识到可以进行标量查询,然后手动提取值,但是没有办法简单地为撤回的对象指定匹配条件吗?

有帮助吗?

解决方案

如果你改变你的HQL看起来像这样:

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

topTen变量将是一个对象[],其中包含2个元素,其中包含2个供稿网址。

如果使用IQuery interfase的SetResultTransformer()方法,则可以将此返回为强类型集合。

其他提示

您需要执行标量查询。以下是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];
    .....
}

rss.FeedUrl 的组导致了这个问题。由于您自己选择实体,因此看起来不需要它。删除它,我认为你会很好。

编辑 - 道歉我没有注意到有关“衍生财产”的部分。我假设你的意思是它不是一个Hibernate映射的属性,因此实际上没有表中的列?这将解释您在查询中收到的第二条错误消息。您可能需要删除“order by”;如果是这样的话,也可以用Java进行排序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top