2016-12-08 8 views
0

Пусть у меня есть столбец в БД 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); 
+0

* Но в Java я не в состоянии сделать так * - Отказ не вариант, поэтому, пожалуйста, сообщите нам, как вы ** ** не удается –

+0

@ScaryWombat я получил сообщение об ошибке: ORA-01858: а был найден нечисловой символ, где ожидалось числовое число. Я подозревал что-то не так с cb.literal(). – Javatar

+0

эй просто распечатайте фактический sql для критерия и параметра привязки, тогда вы узнаете, в чем проблема. Я предполагаю, что это функция TO_DATE, которая принимает аргумент String, но не аргумент типа Date. – diufanman

ответ

0

Кажется, я нашел свой ответ :

predicates.add(cb.equal(cb.function("TRUNC", Date.class, myClass.get("somethingTs")), cb.function("TO_DATE", String.class, cb.parameter(String.class, "somethingTs"), cb.literal("YYYY-MM-DD")))); 

Тогда, когда я устанавливаю параметр, я задам формат даты строки для запроса.

Спасибо!

0

Ответ Джаватара не разрешил мой конкретный случай, но вот что помогло мне в случае, если это поможет кому угодно.

private List<MyClass> selectMyClassByDate(Date date) { 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<MyClass> cq = cb.createQuery(MyClass.class); 
    Root<MyClass> myClass = cq.from(MyClass.class); 
    cq.select(myClass); 
    cq.where(cb.equal(cb.function("date", Date.class, 
     myClass.get(MyClass_.timestamp)), date)); 
    final TypedQuery<MyClass> tq = em.createQuery(cq); 
    log.fine(
     tq.unwrap(org.apache.openjpa.persistence.QueryImpl.class) 
      .getQueryString()); 
    List<MyClass> myClassList = tq.getResultList(); 
    return myClassList; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^