【问题标题】:Filtering on calculated columns in hibernate? (HAVING)过滤休眠中的计算列? (有)
【发布时间】:2010-11-27 09:03:13
【问题描述】:

假设我有一个包含两列 X 和 Y 的表。 我想通过休眠运行以下查询:

SELECT X*X + Y*Y AS Distance, POINTS.* from POINTS 
WHERE X > 0 
AND Y > 0
HAVING Distance < 50

我如何通过休眠实现它?能否提供代码示例?

编辑 - This question 似乎密切相关。我没有将这个作为重复项关闭的唯一原因是因为它提供了一个更简单的用例(没有 GROUP BY)。

【问题讨论】:

  • 该语法无效。 SQL 不允许 HAVING 不使用 GROUP BY 进行分组
  • @a_horse - 它不在 mysql 中。添加了标签。此外,您可以根据需要将我的查询转化为全局有效的查询。
  • 标准方法是在 SELECT 中使用派生表,并在外部 SELECT 中为列别名应用 WHERE 条件。

标签: java sql mysql database hibernate


【解决方案1】:

在大多数 SQL 方言中,您不能使用“显示标签”或“AS 名称”中的名称来引用查询正文中的表达式——这让人们非常懊恼。但是,您可以在 WHERE 子句中使用表达式。

SELECT X*X + Y*Y AS DistanceSquared, POINTS.* from POINTS 
 WHERE X > 0 
   AND Y > 0
   AND (X * X + Y * Y) < 50;

HAVING 子句与聚合和聚合上的比较相关联:

SELECT name, COUNT(*)
  FROM SomeWhere
 GROUP BY Name
HAVING COUNT(*) > 1;

HAVING 子句中的条件必须(应该)涉及至少一个“直接”聚合;条件中的另一个术语可能是常量(如图所示)或另一个直接聚合或子查询,可能涉及“间接”聚合。 (AFAIK,我为此答案发明了“直接/间接”术语 - 您可能无法有效地搜索表达式。)

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多