CriteriaQuery月和年过滤器

时间:2017-02-13 19:19:49

标签: java spring oracle hibernate javax.persistence

我正在尝试在包含一个日期列(Oracle 11G)的模型中进行条件查询(JPA / Hibernate)。例如,我有

  1. 13-JAN-09
  2. 15-JAN-09
  3. 16-MAR-09
  4. 我的功能就像:

    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-JAN-09
    2. 15-JAN-09
    3. 任何帮助都会非常感激, 提前谢谢。

2 个答案:

答案 0 :(得分:3)

您可以使用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) 
    );

答案 1 :(得分:1)

我假设您的日期值为this question

不是制作一个比较日期的各个部分的混乱查询,而是创建两个包含的查询。

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。