【问题标题】:HQL function to extract rows with field contains only numberHQL函数提取行的字段只包含数字
【发布时间】:2025-11-27 14:15:02
【问题描述】:

我有一个小问题要揭露:

我想从一个实体中提取,假设它的名称为“CustomerDetail”,其中特定字段(代码)只有数字字符的所有行。

在 HQL 中不存在像 Sql Server 这样的 ISNUMERIC() 函数,以及应用正则表达式函数的可能性。

可能的解决方案如下:

SELECT C
FROM CustomerDetail C
WHERE C.code NOT LIKE '%A%'
AND C.code NOT LIKE '%B%'

等等重复这个条件整体的字母和特殊字符。

我认为这是一个糟糕的解决方案,性能水平低(LIKE 数量巨大)

拜托,你能给我一个更聪明的解决方案吗?

提前谢谢你

附:我的应用程序是多 DBMS,所以我不能使用 SQL 查询

【问题讨论】:

    标签: regex hibernate hql isnumeric


    【解决方案1】:

    主要编辑: 我的错,我把刚刚工作的函数 isNumeric() 误认为是一个错误的 HQL 函数。 根据doc,HQL 支持数据库标量函数 - 并且 SQLServer(我在其上测试过)具有 isNumeric() 函数。

    我现在看到两个选项:

    选项 1: 您可以为不同的数据库编写不同的 HQL,这些数据库利用 SQLServer 上的 isNumeric() 等内置函数(但就“一次编写到处运行”而言,这是一个巨大的退步)

    选项 2: 为您希望与 SQL 中的自定义函数兼容的每个数据库编写代码,并在您的方言中使用相同的名称注册它。

    我知道,这两种选择都不是很好,但我想不出任何其他方法来让它发挥作用。

    【讨论】:

    • 亲爱的,HQL 没有 isNumeric (正如我在我的问题中写的)
    • 您尝试过我的解决方案吗(包括= 1)?因为,就像我在回答中所写的那样 - 它有效......
    • 在我写一个问题之前...我试试我的代码。这是 HQL 的第 14 章:docs.jboss.org/hibernate/orm/3.3/reference/en/html/… 显示允许的函数。
    【解决方案2】:

    解决方案1:

     (CAST( value_to_check AS DECIMAL) IS NOT NULL)
    

    Solution2(你可以扩展它来检查十六进制数字):

     ((size(SPLIT(value_to_check, "0"))-1) +
     (size(SPLIT(value_to_check, "1"))-1) +
     (size(SPLIT(value_to_check, "2"))-1) +
     (size(SPLIT(value_to_check, "3"))-1) +
     (size(SPLIT(value_to_check, "4"))-1) +
     (size(SPLIT(value_to_check, "5"))-1) +
     (size(SPLIT(value_to_check, "6"))-1) +
     (size(SPLIT(value_to_check, "7"))-1) +
     (size(SPLIT(value_to_check, "8"))-1) +
     (size(SPLIT(value_to_check, "9"))-1) = LENGTH(value_to_check))
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center