如何在@Formula中使用别名

Toa*_*Dao 9 oracle spring hibernate jpa spring-boot

所以今天我遇到了一个问题,@Formula 没有按我的预期工作。让我们说:

数据库

year |  X  |  Y 
-----+-----+-----
2010 |  A  |  10
2011 |  A  |  20
2011 |  B  |  99
2009 |  C  |  30
2010 |  C  |  40
Run Code Online (Sandbox Code Playgroud)


我想获得“Y”最高的年份并按“X”分组,所以我编写了这样的查询

SELECT year
FROM (SELECT
        year,
        MAX(y) OVER (PARTITION BY x ) max_y
      FROM TableB) q
WHERE year = '2011' and x = 'A';
Run Code Online (Sandbox Code Playgroud)


所以结果是

year |
-----+
2011 |
Run Code Online (Sandbox Code Playgroud)


然后我想在实体中使用它,所以我用 @Formula 创建实体

@Formula("(SELECT year FROM (SELECT b.year, MAX(b.y) OVER(PARTITION BY b.x) max_y FROM TableB b) q WHERE year = '2011' AND x = 'A')")
private String yearWithHighestScore;
Run Code Online (Sandbox Code Playgroud)

但 Hibernate 会处理成:

(select entity0_.year as year1_8_ 
from (select b.year as name, max(b.y) over(partition by b.year) entity0_.max_y from TableB b) entity0_.q 
where entity0_.year=? and entity0_.x=?) as formula0_1_
Run Code Online (Sandbox Code Playgroud)

您会看到 Hibernate 将其转换为“entity0_.max_y”,这是不正确的,因为 max_y 不是表 TableB 的列;它只是计算列的别名

我的问题:我们可以有什么办法告诉 Hibernate 它是列的别名,而不是列名本身吗?

谢谢

pdo*_*ide 5

别名名称前加上“_”前缀:

@Formula("(SELECT year FROM (SELECT b.year, MAX(b.y) OVER(PARTITION BY b.x) _max_y FROM TableB b) _q WHERE year = '2011' AND x = 'A')")
Run Code Online (Sandbox Code Playgroud)