如何使用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在数据库级别执行此操作吗?
编辑:我们意识到可以进行标量查询,然后手动提取值,但是没有办法简单地为撤回的对象指定匹配条件吗?
答案 0 :(得分:3)
如果你改变你的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()方法,则可以将此返回为强类型集合。
答案 1 :(得分:0)
导致问题的是group by rss.FeedUrl
。由于您自己选择实体,因此看起来不需要它。删除它,我认为你会很好。
编辑 - 道歉我没有注意到关于“衍生财产”的部分。我假设你的意思是它不是Hibernate映射的属性,因此表中实际上没有列?这将解释您在查询中收到的第二条错误消息。如果是这种情况,您可能还需要删除“order by”子句并在Java中进行排序。
答案 2 :(得分:0)
您需要执行标量查询。以下是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];
.....
}