我的查询就像这样
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
答案 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>
...