非hibernate组按每个外键选择最新行
本文关键字:选择 最新 hibernate | 更新日期: 2023-09-27 18:11:36
我在使用NHibernate和一个简单的GROUP BY表达式时遇到了困难。
我有一个记录用户活动的表。我需要返回每个用户的最新活动行,按时间降序排序,这也对应于降序id(自动递增)。
基本上,这就是我想要运行的SQL:
SELECT * FROM log_user_activity GROUP BY UserID DESC
我搜索了一个类似的问题,并得到了一堆答案与投影,子查询,dto…
是否有任何简单的方法可以做到这一点,而不需要定义一个新的DTO类,或者使用一个带有匿名对象的投影,我必须再次手动指定所有列?使用QueryOver语法的解决方案更可取,但不是强制性的。
是否有任何简单的方法可以做到这一点,而不需要定义一个新的DTO类,或者使用一个带有匿名对象的投影,我必须再次手动指定所有列?
不,没有别的办法,那么:
- 选择映射对象作为或
- 选择投影 - ,可以但不一定要转换为原始或DTO对象(我们总是可以返回
.List<object[]>()
…)
但是我们能做的是从16.8获利。子查询,并返回映射对象的列表为,它们是,通过max Time
属性过滤:
ActivityLog activity = null;
// subquery to be later used for EXISTS
var maxSubquery = QueryOver.Of<ActivityLog>()
.SelectList(l => l
.SelectGroup(item => item.UserID)
.SelectMax(item => item.Time)
)
// WHERE Clause
.Where(x => x.UserID == activity.UserID )
// HAVING Clause
.Where(Restrictions.EqProperty(
Projections.Max<ActivityLog>(item => item.Time),
Projections.Property(() => activity.Time)
));
// final query without any transformations/projections... but filtered
var result = session.QueryOver<ActivityLog>(() => activity)
.WithSubquery
.WhereExists(maxSubquery)
.List<ActivityLog>()
;
也检查这些:
- 查询HasMany参考
- 自定义结果转换器在其他情况下可能很有趣