【问题标题】:How to QueryOver using correlated subqueries over an aggregate value?如何在聚合值上使用相关子查询 QueryOver?
【发布时间】:2011-04-04 15:22:26
【问题描述】:

我有以下域映射:

Person
------
int PersonId
IList<PersonDetails> Details;

PersonDetails
-------------
Person Owner (mapped by using the FK field, PersonId)
string Name
string Address
DateTime UpdateDate

翻译成类似的表结构:

Person
------
PersonId (int)
Birthday (date)

PersonDetails
-------------
PersonId (FK, integer)
Name (string)
Address (string)
UpdateDate (date)

如何使用 QueryOver 重新创建以下 SQL 查询?

SELECT * 
FROM Person p INNER JOIN Details d ON p.PersonId = d.PersonId 
WHERE d.UpdateDate = (SELECT MAX(UpdateDate) 
                      FROM   PersonDetails
                      WHERE  PersonId = p.PersonId);

即,为每个人选择最新的 PersonDetails。 我见过一些例子,但它们都没有与使用聚合值的相关子查询相关......

谢谢, 哈雷尔

【问题讨论】:

  • 对不起,您的表关系是 OneToMany,对吗?
  • 哦,对不起,我忘记了这个细节 - 映射确实是一对多的关系,因为 Person 可以“拥有”许多 PersonDetails 对象。
  • 很抱歉,我还没有为您的查询找到解决方案,但是...如果您使用 Fluent NHibernate 将您的表映射到您的模型,并且您对 Person 和 PersonDetails 的查询总是使用 SELECT MAX(UpdateDate) 也许我有一个想法:-)

标签: nhibernate queryover


【解决方案1】:

嘿,在苦苦寻找解决方案之后,以下方法成功了:

QueryOver.Of<Person>(() => personAlias)
     .Left.JoinAlias(p => p.Details, () => personDetailsAlias)
     .WithSubquery.WhereProperty(() => personDetailsAlias.UpdateDate).Eq(
            QueryOver.Of<PersonDetails>(() => maxPersonDetailsAlias)
                 .Where(ps => maxPersonDetailsAlias.Owner.Id == personAlias.Id)
                 .Select(Projections.Max<PersonDetails>(ps => ps.UpdateDate)))
                     .SelectList(resList => resList.Select(() => personAlias.Id).Select(() => personDetailsAlias.Id));

所以加入相关子查询的方法是使用别名“外部”查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多