【问题标题】:NHibernate Nested query in FROM clauseFROM 子句中的 NHibernate 嵌套查询
【发布时间】:2011-02-21 22:46:31
【问题描述】:

我在将 T-SQL 查询转换为 Nhibernate 查询时遇到问题 - 或者编写将返回相同结果但将用 NH 查询语言(HQL、Criteria、QueryOver、LINQ 正确编写)的查询 - 我不是真的关心)。

我想从 NHibernate 执行类似的查询:

SELECT
  lic.RegNo,
  lic.ReviewStatus
FROM
  Licence lic
WHERE
  lic.RegNo IN
  (
    SELECT
      grouped.RegNo
    FROM
    (
      SELECT
        g.[Type],
        g.Number,
        MAX(g.Iteration) AS [Iteration],
        MAX(g.RegNo) AS [RegNo]
      FROM
        Licence g
      GROUP BY
        g.[Type],
        g.Number
    ) as grouped
  )
ORDER BY
  lic.RegNo desc  

它返回最多的许可证并获取其审查状态(如果存在)。 RegNo 由 Type、Number 和 Iteration 创建(模式:{0}{1:0000}-{2:00})。每个许可证可以有多次迭代,其中一些可以包含 ReviewStatus,例如:

W0004-01    NULL
W0001-03    1
P0004-02    3
P0001-02    4

如果迭代部分大于 1,则表示特定许可证有多次迭代 (n)。

我已经成功地通过两次访问数据库来创建 NH 查询:

LicenceInfoViewModel c = null;
var grouped = session.QueryOver<Licence>()
    .SelectList(l => l
    .SelectGroup(x => x.Type)
    .SelectGroup(x => x.Number)
    .SelectMax(x => x.Iteration)
    .SelectMax(x => x.RegNo).WithAlias(() => c.RegNo)
).TransformUsing(Transformers.AliasToBean<LicenceInfoViewModel>())
.Future<LicenceInfoViewModel>();

var proper = session.QueryOver<Licence>()
    .Select(x => x.RegNo, x => x.ReviewStatus)
    .WhereRestrictionOn(x => x.RegNo)
    .IsIn(grouped.Select(x => x.RegNo).ToArray())
    .TransformUsing(Transformers.AliasToBean<LicenceInfoViewModel>())
    .List<LicenceInfoViewModel>();

// ...

public class LicenceInfoViewModel
{
  public string RegNo { get; set; }
  public LicReviewStatus? ReviewStatus { get; set; }
}

public enum LicReviewStatus
{
  InProgress,
  Submitted,
  Validated,
  RequestForInformation,
  DecissionIssued
}

但是这个解决方案并不好,因为它需要从数据库中下载所有分组的许可证,并且可能有数千个。

有没有更好的方法来编写这个查询,或者有没有办法将上面提供的 T-SQL 查询转换为 NHibernate?

添加 nhibernate 和 hibernate 标签作为 IMO,如果这可以在 hibernate 中完成,它应该很容易翻译成 nh

【问题讨论】:

    标签: nhibernate hibernate


    【解决方案1】:

    我认为 SQL 不会像您认为的那样做。迭代不用于任何事情。

    无论如何,这似乎是不必要的。您可以将 WHERE 更改为以下内容,并且您将拥有有效的 SQL 和 HQL:

    lic.RegNo IN
    (
      SELECT
        MAX(g.RegNo)
      FROM
        Licence g
      GROUP BY
        g.Type,
        g.Number
    )
    

    【讨论】:

    • 谢谢,认为是这样 - 我一定很累 :),明天会尝试 - 有没有办法使用 QueryOver 或 Criteria API 来执行此操作,所以我不会在执行时选择类型和编号分组?
    • 我不知道...这种查询只是用 HQL 更容易做到。
    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多