Java 如何使用条件查询将where子句中的字符串字段转换为数字?

Java 如何使用条件查询将where子句中的字符串字段转换为数字?,java,hibernate,jpa,criteria-api,Java,Hibernate,Jpa,Criteria Api,我使用CriteriaAPI创建查询,使用Hibernate作为实现。该数据库是一个MS SQL Server 2014 在我的数据库中,我有一个字符串字段,它包含数字和字符串。我想把这些数字和一个数值进行比较。 在SQL中,它是这样的: select * from table where ISNUMERIC(table.value) and CONVERT(float, table.value) > 5 (不要在函数名上引用我的话。)在条件查询中似乎没有直接的方法,所以我尝试使用fun

我使用CriteriaAPI创建查询,使用Hibernate作为实现。该数据库是一个MS SQL Server 2014

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

select *
from table
where ISNUMERIC(table.value) and CONVERT(float, table.value) > 5
(不要在函数名上引用我的话。)在条件查询中似乎没有直接的方法,所以我尝试使用function()方法:

Expression convertedExpression=criteria.function(“CONVERT”、Float.class、criteria.literal(Float.class)、baseExpression);
但这种方法给出了一些毫无帮助的错误消息,如“不正确的语法接近”或“不正确的语法接近@P1”。我认为这是因为传递给方法的第一个参数,它必须是我想要转换的类型


如果您能帮助CONVERT函数工作或采用完全不同的方法,我们将不胜感激。

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

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

看来JPA及其限制条件API根本不允许您执行您想要的操作,即。E要传递事实上的关键字,在本例中,
float
,作为函数调用的参数。类似地,它不支持向查询中添加“原生SQL条件”(因此也不能使用SQL标准
CAST(…)
)。这是一个很好的理由

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


顺便说一句,这个问题似乎是重复的。

看来JPA及其限制标准API根本不会让你做你想做的事情,即。E要传递事实上的关键字,在本例中,
float
,作为函数调用的参数。类似地,它不支持向查询中添加“原生SQL条件”(因此也不能使用SQL标准
CAST(…)
)。这是一个很好的理由

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


顺便说一句,这个问题似乎是重复的。

该列已映射为字符串(并且它是数据库中的字符串列)。但是有些条目(但不是全部)实际上是数字,我想对这些条目进行比较。另一个是编写本机查询。该列已映射为字符串(并且它是数据库中的字符串列)。但是有些条目(但不是全部)实际上是数字,我想对这些条目进行比较。二是编写本机查询。
Expression<Float> convertedExpression = criteria.function("CONVERT", Float.class, criteria.literal(Float.class), baseExpression);