我正在使用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功能起作用的帮助或完全不同的方法都将受到高度赞赏。
答案 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?重复。