8

我的查询是这样的:

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))

我从 ajax 日期选择器获取startDate和获取。是系统日期,我得到这样的:endDatedate

Date utiDate = new Date();

当我执行我的查询时,我得到了错误:

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

2 回答 2

9

试图找到正确的答案,我在这里找到了一个有趣的帖子。

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

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

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

于 2013-05-16T16:29:34.307 回答
2

bean 中的属性 :startDate 和 :endDate 不是 java.util.Date 类型,而是 Hibernate 无法自动转换为 SQL-DATE 并且默认发送 BINARY 的其他东西。

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

有一些教程

提示:如果您将该转换器放在您的 war 应用程序中包含的某个 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>
        ...
于 2018-08-14T09:05:45.183 回答