ORA-00932:不一致的数据类型:预期DATE在Hibernate中获得BINARY

时间:2013-05-16 08:33:44

标签: java sql oracle hibernate

我的查询就像这样

from TRS where (:startDate is null or :endDate is null or DDATE between :startDate AND :endDate) AND (:startDate is null or (:endDate is not null or DDATE between :startDate AND :date))

startDAte和endDate我从ajax获取日期选择器,但是日期是我得到的系统日期

Date utiDate = new Date();

当我执行查询时出现错误

java.sql.SQLException: ORA-00932: inconsistent datatypes: expected DATE got BINARY

2 个答案:

答案 0 :(得分:6)

试图找到正确的答案,我发现了一篇有趣的帖子here

如果:endDate为空,则无法确定不会评估条件DDATE between :startDate AND :endDate。如果它被评估,Oracle将尝试将空值转换为日期,因此它会给你一个错误。

尝试测试删除DDATE between :startDate AND :endDate部分的查询:您不应再出现错误。然后,您必须修改查询,以确保between为空时不会评估:enddate运算符。在this post中,他们建议在CASE子句中使用WHERE语句。也许它可以解决你的问题。

关于短路评估和Oracle数据库,我发现that question可以帮助您理解问题。

答案 1 :(得分:1)

Bean中的属性:startDate和:endDate的类型不是java.util.Date,但是Hibernate不能自动将其转换为SQL-DATE的其他内容,并且默认情况下发送BINARY。

您需要实现javax.persistence.AttributeConverter< X, Y >

上面有一些tutorial

提示:如果将转换器放置在战争应用程序中包含的某个jar中,则必须在persistemce.xml中明确列出它,否则将找不到您的转换器:

    <persistence-unit name="default" transaction-type="JTA">
        <jta-data-source>java:/mydb</jta-data-source>

        <!-- register converter -->
        <class>com.example.persistence.LocalDateTimeConverter</class>
        ...