5

我有一个小问题要暴露:

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

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

一个可能的解决方案如下:

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

依此类推,重复此条件整体字母和特殊字符。

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

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

先感谢您

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

4

2 回答 2

1

主要编辑:我的错,我把刚刚工作的函数 isNumeric() 误认为是一个错误的 HQL 函数。根据文档, HQL 支持数据库标量函数 - 而 SQLServer(我测试过的)有一个 isNumeric() 函数。

我现在看到两个选项:

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

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

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

于 2013-10-15T11:43:26.777 回答
0

解决方案1:

 (CAST( value_to_check AS DECIMAL) IS NOT NULL)

解决方案2(您可以扩展它以检查甚至十六进制数字):

 ((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))
于 2021-11-30T14:29:37.660 回答