【问题标题】:convert oracle SQL to JPQL using cast and max function使用 cast 和 max 函数将 oracle SQL 转换为 JPQL
【发布时间】:2018-06-27 00:34:58
【问题描述】:

我有一个这样的 sql:

SELECT MAX(CAST(XX AS integer)) FROM TableA; 

其中XXvarchar2,我想将其转换为JPQL。我试过了:

SELECT FUNCTION('NVL', CAST(MAX(XX) NUMERIC(10,2)), '0') FROM TableA;

SELECT FUNCTION('NVL', FUNCTION('TO_NUMBER', MAX(XX)), '0') FROM TableA;

但它只是不断弹出异常。我认为我的语法是正确的,但只是不知道问题出在哪里。有人可以提供一些建议吗?非常感谢~~

【问题讨论】:

    标签: java sql oracle jpql


    【解决方案1】:

    我认为CASTEclipseLink Query Language (EQL) 扩展的一部分,但不是核心JPQL 的一部分。如果您不支持 EQL,那么您的查询可能不起作用。一种解决方法是将以下内容作为本机查询运行:

    SELECT MAX(CAST(XX AS integer)) FROM TableA;
    

    另一种可能性是将XX 列更改为数字类型。由于您需要对该列进行数学运算,因此将其设为数字​​可能是有意义的。

    【讨论】:

    • 但我也遇到了一个问题,如果结果为null,我需要返回0,所以我还需要使用nvl...
    • @MaxNg 使用本机查询,这当然不是问题。或者,只需将 XX 设为数字即可。我认为COALESCEJPQL 的一部分。
    • 恐怕我不能按照公司的标准使用 JPQL,我只是想知道在这种情况下 JPQL 应该是什么样子
    • Max,我的意思是你的 JPQL 版本可能不支持这个。最好的办法可能是使XX 成为数据库中的数字列。顺便说一句,如果XX 是固定宽度(即在固定宽度处用零填充到左侧),那么您可以只取文本的MAX,它应该是正确的。
    • 遗憾的是 XX 不是固定宽度......这次更改 DB 列不是一个选项。我找到了另一种使用 select A.x from A where A.b = ( select max(A.b) from A ) 的方法,但我不知道如何用 JPQL 编写它,尝试了很多次仍然出错。
    猜你喜欢
    • 2011-06-12
    • 2014-08-02
    • 2018-03-16
    • 2016-11-13
    • 1970-01-01
    • 2015-06-21
    • 2021-06-14
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多