如何使用Criteria查询将String字段转换为where子句中的数字?

时间:2016-05-03 14:58:20

标签: java hibernate hibernate-criteria criteria-api

我正在使用Criteria API来创建我的查询,使用Hibernate作为实现。该数据库是MS SQL Server 2014。

在我的数据库中,我有一个字符串字段,其中包含数字和字符串。我想将数字与数值进行比较。 在SQL中它将是这样的:

select *
from table
where ISNUMERIC(table.value) and CONVERT(float, table.value) > 5

(不要在函数名称上引用我。)在Criteria查询中似乎没有直接的方法,所以我尝试使用function()方法:

Expression<Float> convertedExpression = criteria.function("CONVERT", Float.class, criteria.literal(Float.class), baseExpression);

但是这种方法给出了一些无用的错误消息,例如“语法不正确”或“@ P1附近的语法不正确”。我认为这是因为传递给方法的第一个参数,它必须是我想要转换为的类型。

任何有助于使CONVERT功能起作用的帮助或完全不同的方法都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

将列建模为String - 这样您可以依靠条件api转换为String。如果你期望特定的格式 - 这样做 - 我的意思是将你的浮动格式化为特定的字符串,并将其传递给标准。

答案 1 :(得分:0)

似乎JPA及其限制条件API根本不会让你做你想要的事情,我。即在这种情况下传递一个事实上的关键字float作为函数调用的参数。同样,它不支持向查询添加“本机SQL条件”(因此也不能使用SQL标准CAST(...))。希望这是有充分理由的......

所以唯一的方法似乎是在数据库级别解决这个问题:要么在数据库中使用现有的,要么在每个必需的类型(例如FLOAT(str))创建自定义转换函数,或者定义并为您的表使用数字列(例如,通过触发器使其与源字符串列保持同步)。

BTW这个问题似乎与How to properly cast string to number with JPA2 Criteria API?重复。