【发布时间】:2017-04-23 03:29:23
【问题描述】:
假设我在 Oracle DB 中有这样的列:
SOMETHING_TS TIMESTAMP WITH TIME ZONE
我想使用 CriteriaQuery 按此列进行过滤。
我可以使用本机查询来实现这一点:
SELECT *
FROM SOMETHING
WHERE TRUNC(SOMETHING_TS) = TO_DATE('2016-12-08','YYYY-MM-DD');
但在 Java 中我没有这样做,下面是我的示例代码:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyClass> cq = cb.createQuery(MyClass.class);
Date date = new Date();
predicates.add(cb.equal(cb.function("TRUNC", Date.class, myClass.get("somethingTs")), cb.function("TO_DATE", Date.class, cb.parameter(Date.class, "somethingTs"), cb.literal("YYYY-MM-DD"))));
Predicate[] predArray = new Predicate[predicates.size()];
predicates.toArray(predArray);
cq.where(predArray);
TypedQuery<MyClass> query = em.createQuery(cq);
query.setParameter("somethingDt", date);
【问题讨论】:
-
但在 Java 中我没有这样做 - 失败不是一种选择,所以请告诉我们你是如何失败的
-
@ScaryWombat 我收到此错误消息:ORA-01858:在需要数字的地方发现了一个非数字字符。我怀疑 cb.literal() 有问题。
-
嘿,只要打印出条件查询和绑定参数的实际 sql,您就会知道问题出在哪里。我猜它是 TO_DATE 函数,它接受一个字符串参数,但不是日期类型参数。
-
@diufanman 是的,正确的。我还发现这是问题的根本原因。谢谢!
标签: java oracle jpa timestamp criteriaquery