Пусть у меня есть столбец в БД Oracle, как это:JPA CriteriaQuery сравнить Отметка игнорировать временную часть
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(). – Javatar
эй просто распечатайте фактический sql для критерия и параметра привязки, тогда вы узнаете, в чем проблема. Я предполагаю, что это функция TO_DATE, которая принимает аргумент String, но не аргумент типа Date. – diufanman