Java 在hql中强制转换字符串列

Java 在hql中强制转换字符串列,java,string,hibernate,casting,hql,Java,String,Hibernate,Casting,Hql,我需要获得2015年1月1日之前的所有记录。由于nt.valeur的数据类型为varchar(255),因此此查询不起作用。我无法更改实体NotifTypeActionChampAddValVO的结构。 数据库服务器位于DB2Version9.7上 以下是hql: select nt.valeur from NotifTypeActionChampAddValVO nt where nt.valide = 1 and nt.typeActionChampAdditionnelValue.ch

我需要获得2015年1月1日之前的所有记录。由于nt.valeur的数据类型为varchar(255),因此此查询不起作用。我无法更改实体NotifTypeActionChampAddValVO的结构。 数据库服务器位于DB2Version9.7上

以下是hql:

select nt.valeur from NotifTypeActionChampAddValVO  nt where nt.valide = 1  and nt.typeActionChampAdditionnelValue.champAdditionnel.id = 123  and cast(nt.valeur as date) = '01/01/2015')
我试着使用cast(nt.valeur作为date),但它生成了一个异常

这是个例外

DIAVERUM 2015-01-23 13:23:21,859 [http-8081-7] ERROR org.hibernate.util.JDBCExceptionReporter  - DB2 SQL Error: SQLCODE=-461, SQLSTATE=42846, SQLERRMC=SYSIBM.LONG VARCHAR;SYSIBM.DATE, DRIVER=3.63.75
DIAVERUM 2015-01-23 13:23:21,859 [http-8081-7] ERROR org.hibernate.util.JDBCExceptionReporter  - DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-461;42846;SYSIBM.LONG VARCHAR|SYSIBM.DATE, DRIVER=3.63.75
我怎样才能投出这个专栏
在hql中将此字符串列作为日期进行比较的方式有哪些

您可以使用db2 to_date函数将不同的字符串格式转换为最新格式。 比如说

date(to_date(column,'DD-MM-YYYY HH:MI:SS'))
因此,您的查询可能是(取决于列
nt.valeur
上使用的格式)

见:


to_date实际上是函数的别名,其中格式字符串的格式记录得更好

您无需尝试将字符串强制转换为最新字符串即可执行此操作。试试这个

select nt.valeur from NotifTypeActionChampAddValVO  nt where nt.valide = 1  and nt.typeActionChampAdditionnelValue.champAdditionnel.id = 123  and concat(substring(nt.valeur, 7, 4), substring(nt.valeur, 4, 2), substring(nt.valeur, 1, 2)) > '20150101'
假设示例中的
01/01/2015
dd/MM/yyyyy
(但可以轻松更改),并且您可以将参数格式调整为
yyyyymmdd

尝试以下方法:-

from NotifTypeActionChampAddValVO  nt where nt.valide = 1  and nt.typeActionChampAdditionnelValue.champAdditionnel.id = 123  and nt.valeur ='2015-01-01'

你试过“yyyy-MM-dd”吗?从NotifTypeActionChampAddValVO nt中选择nt.valeur,其中nt.valide=1,nt.typeActionChampAdditionnelValue.champAdditionnel.id=123,并强制转换(nt.valeur as date)='2015/01/01')是的,我收到了相同的错误最后一条评论您可以尝试“2015-01-01”?您可以尝试
yyyyy-MM-dd
格式。。对的引用我尝试了“2015/01/01”和“2015-01-01”,但返回时出现了相同的异常。我得到了相同的异常,因为日期的字符串格式可能取决于区域设置。请尝试
从NotifTypeActionChampAddValVO nt中选择nt.valeur,其中nt.valide=1,nt.typeActionChampAdditionnelValue.champAdditionnel.id=123和日期(截止日期(nt.valeur,'DD-MM-yyyyy HH:MI:SS'))=日期(截止日期('01-01-2015 00:00','DD-MM-yyyyyy HH:MI:SS'))
。但是请根据单元格的格式编辑格式字符串。这不会比较日期,而是比较两个字符串。
from NotifTypeActionChampAddValVO  nt where nt.valide = 1  and nt.typeActionChampAdditionnelValue.champAdditionnel.id = 123  and nt.valeur ='2015-01-01'