Фильтр месяца и года CriteriaQuery

Я пытаюсь сделать запрос критериев (JPA/Hibernate) в модели, содержащей один столбец с датой (Oracle 11G). Например, у меня есть

  1. 13 января 2009 г.
  2. 15 января 2009 г.
  3. 16 марта 2009 г.

И моя функция похожа на:

public MyEntity getEntitiesFromCertainFilters(int a, int b, java.util.date c)
{
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery< MyEntity > query = builder.createQuery(MyEntity.class);
    Root< MyEntity > root = query.from(MyEntity.class);

    query.select(root).where (
        builder.equal ( root.get ( "id" ).get ( "codEstablec" ) , establecimiento),
        builder.equal ( root.get ( "id" ).get ( "correlGrupo" ) , correlGrupo),
        //HERE I NEED TO ADD FILTER BY C.MONTH AND C.YEAR FROM THE DATE ATTRIBUTE
        );

    List < MyEntity > resultList = entityManager.createQuery(query).getResultList();  
    return resultList.get(0);
}

Если я хочу отфильтровать по c = "01-JAN-09", он должен вернуть:

  1. 13 января 2009 г.
  2. 15 января 2009 г.

Любая помощь будет очень признательна, спасибо заранее.


person Rcordoval    schedule 13.02.2017    source источник
comment
Итак, цель состоит в том, чтобы найти даты, выпадающие на один месяц?   -  person Compass    schedule 13.02.2017
comment
И год, но с любым из них я могу воспроизвести логику.   -  person Rcordoval    schedule 13.02.2017


Ответы (2)


Вы можете использовать метод builder.function. Например.

query.select(root).where (
    builder.equal ( root.get ( "id" ).get ( "codEstablec" ) , establecimiento),
    builder.equal ( root.get ( "id" ).get ( "correlGrupo" ) , correlGrupo),
    builder.equal(builder.function("YEAR", Integer.class, root.get("DATE_FIELD") ), C.YEAR),
    builder.equal(builder.function("MONTH", Integer.class, root.get("DATE_FIELD")), C.MONTH) 
    );
person tharanga-dinesh    schedule 27.09.2018
comment
Ух ты. Я забыл об этом проекте (2017). Но я проверил источник и сделал то, что вы опубликовали. builder.equal(builder.function("month", Integer.class, root.get("id").get("anoMes")), mes), Немного поздно, но я дам вам согласие. Ваше здоровье! - person Rcordoval; 27.09.2018

Я предполагаю, что вы получаете значения даты, такие как этот вопрос.

Вместо того, чтобы делать беспорядочный запрос, сравнивающий отдельные части дат, просто создайте два охватывающих запроса.

Date c; //this is your provided date.
Date d; //this is your endpoint.

d = new Date(c.getTime());
d.setMonth(d.getMonth()+1); // creates 01FEB09

С этого момента все, что вам нужно сделать, это найти даты GREATERTHANOREQUALTO c и LESSTHAN d.

person Compass    schedule 13.02.2017
comment
Я думал что-то подобное, но февраль был моим пограничным случаем. Я попробую это сейчас. - person Rcordoval; 13.02.2017