【问题标题】:How do I convert a String field to a number in a where clause using a Criteria query?如何使用条件查询将字符串字段转换为 where 子句中的数字?
【发布时间】:2016-05-03 14:58:19
【问题描述】:

我使用 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 函数工作或完全不同的方法将不胜感激。

【问题讨论】:

    标签: java hibernate jpa criteria-api


    【解决方案1】:

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

    【讨论】:

    • 该列已经映射为字符串(并且它是数据库中的字符串列)。但有些条目(但不是全部)实际上是数字,我想对这些进行 、= 比较。
    • 如果你真的需要 Criteria SqlProjection 看起来是唯一的选择。其他是写原生查询。
    【解决方案2】:

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

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

    顺便说一句,这个问题似乎与 How to properly cast string to number with JPA2 Criteria API? 重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2014-04-03
      相关资源
      最近更新 更多