Java 如何在Hibernate和Oracle中使用命名查询以数字形式搜索字符串?

Java 如何在Hibernate和Oracle中使用命名查询以数字形式搜索字符串?,java,oracle,hibernate,hibernate-mapping,named-query,Java,Oracle,Hibernate,Hibernate Mapping,Named Query,在Oracle中,数据类型是vArchar,我们有一些ID以0000123格式存储。从源代码中,我们获得的ID为123或1234,前面为0。在某些情况下,数据仅存储为123 在SQL查询中,我可以简单地使用 Select * from Table where ID = 123 (It wil fetch even if 000123 id is present) 有没有办法通过hibernate通过hibernate使用命名查询来实现它,就像oracle中当前使用的那样,它是针对Varchar

在Oracle中,数据类型是vArchar,我们有一些ID以0000123格式存储。从源代码中,我们获得的ID为123或1234,前面为0。在某些情况下,数据仅存储为123

在SQL查询中,我可以简单地使用

Select * from Table where ID = 123 (It wil fetch even if 000123 id is present)

有没有办法通过hibernate通过hibernate使用命名查询来实现它,就像oracle中当前使用的那样,它是针对Varchar的字符串,并且当搜索123时不会返回正确的结果。?

查询会自动转换为以下内容:

Select * from Table where TO_NUMBER(ID) = 123
SELECT
    *
FROM
    EMPS
WHERE
    LTRIM(EMP_NAME, '0') = TO_CHAR(LTRIM(123, '0'));
所以你可以用它来代替

您还可以使用:

SELECT * from Table where LTRIM(ID,'0') = LTRIM(123,'0')

如果ID列中有非数值。

如果应用Radagast81的答案时出现错误,请尝试使用
to_char()
将数字转换为varchar,如下所示:

Select * from Table where TO_NUMBER(ID) = 123
SELECT
    *
FROM
    EMPS
WHERE
    LTRIM(EMP_NAME, '0') = TO_CHAR(LTRIM(123, '0'));
您还可以使用
LPAD
实现相同的功能:

SELECT
    *
FROM
    EMPS
WHERE
    EMP_NAME = LPAD(123, LENGTH(EMP_NAME), '0'));

干杯

若您可以指定一个表中不存在的默认编号,则可以使用它。请参见下面的示例:

Select * from Table where TO_NUMBER(ID DEFAULT -999999999999 ON CONVERSION ERROR ) = 123

此查询在Oracle中不起作用。Oracle Database 12c Enterprise Edition 12.1.0.2.0版-64位产品错误消息是什么?java中的绑定变量是什么数据类型(应该是一些数字数据类型)?id列中有不是数字的值吗?我添加了一个更稳定的替代解决方案,但第一个是如果输入已发布的查询,通常会执行的解决方案,因此,这也应该起作用。错误消息:ORA-01722:无效数字最有可能在数据库的ID列中有非数字字符。
LTRIM(123,'0')
LTRIM(TO_CHAR(123),'0')相同
as
LTRIM
仅为
varchar2
clob
定义,因此不需要显式转换。