hql查询中表达式的别名

时间:2011-08-17 23:20:44

标签: sql hql

我的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,

仍在学习史蒂夫

1 个答案:

答案 0 :(得分:0)

这是一个老问题,所以我希望你现在已经找到了答案,但是如果你还没有,我已经学到了一些关于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 _的形式_

希望这会有所帮助,祝你好运