【问题标题】:alias for expressions in hql querieshql 查询中表达式的别名
【发布时间】:2011-08-17 23:20:44
【问题描述】:

我的 Hibernate 版本是 3.2.6.ga

谷歌搜索发现很多人都遇到了同样的问题 Hibernate HQL 不能很好地处理别名。显然 HQL 只允许 您为表中存在的列设置别名。此外,HQL 会生成自己的 查询中所有列的别名,这些具有以下形式 col_x_y_ 但我不知道这些是如何生成的。

就我而言,我想将两个派生列添加到第三个派生列中。 在原生 SQL 中微不足道,在 HQL 中非常困难。

我设计的简化示例:

sqlcmd = " SELECT  aa.course.code, " +
         "        (CASE WHEN aa.gender = 'M' THEN 1 ELSE 0 END),  " +
         "        (CASE WHEN aa.gender = 'F' THEN 1 ELSE 0 END),  " +
         "        ( col_0_1_ + col_0_2_ ) " +
         "        FROM Student AS aa ";

如何将第 2 列和第 3 列加在一起以形成 HQL 中的第 4 列?

TIA,

还在学习的史蒂夫

【问题讨论】:

    标签: sql hql


    【解决方案1】:

    这是一个老问题,所以我希望你现在已经找到了答案,但如果你还没有,我学到了一些关于 nhibernate 如何处理列别名的新知识。所以这是我给你的答案。

    sqlcmd = " SELECT  aa.course.code, " +
             "        (CASE WHEN aa.gender = 'M' THEN 1 ELSE 0 END),  " +
             "        (CASE WHEN aa.gender = 'F' THEN 1 ELSE 0 END),  " +
             "        ( col_0_1_ + col_0_2_ ) " +
             "        ( col_0_2_ + col_0_3_ ) " + 
             "        FROM Student AS aa ";
    

    您确实自己回答了这个问题,注意到 NH 会生成它自己的列别名。我的研究告诉我,这只存在于 ORDER BY 语句中,这是他们正在处理的错误。老实说,我认为您可以在这里使用自己的列别名

    sqlcmd = " SELECT  aa.course.code, " +
             "        (CASE WHEN aa.gender = 'M' THEN 1 ELSE 0 END) myCol1,  " +
             "        (CASE WHEN aa.gender = 'F' THEN 1 ELSE 0 END) myCol2,  " +
             "        ( myCol1 + myCol2 ) myCol3 " +
             "        ( myCol2 + myCol3 ) myCol4 " + 
             "        FROM Student AS aa ";
    

    但在任何一种情况下,您都可以继续使用 NH 向您抛出的别名,它将采用 col_x_y_ 的形式

    希望对你有帮助,祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多