非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语法的解决方案更可取,但不是强制性的。

非hibernate组按每个外键选择最新行

是否有任何简单的方法可以做到这一点,而不需要定义一个新的DTO类,或者使用一个带有匿名对象的投影,我必须再次手动指定所有列?

不,没有别的办法,那么:

  1. 选择映射对象作为
  2. 选择投影 - ,可以但不一定要转换为原始或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参考
  • 自定义结果转换器在其他情况下可能很有趣