5

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

  1. 2009 年 1 月 13 日
  2. 2009 年 1 月 15 日
  3. 09 年 3 月 16 日

我的功能是:

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. 2009 年 1 月 13 日
  2. 2009 年 1 月 15 日

任何帮助将不胜感激,在此先感谢。

4

2 回答 2

11

您可以使用 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) 
    );
于 2018-09-27T06:34:53.540 回答
1

我假设你得到了像这个问题这样的日期值。

与其进行比较日期的各个部分的凌乱查询,不如创建两个包含查询。

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

从那时起,您需要做的就是找到日期GREATERTHANOREQUALTOc 和LESSTHANd。

于 2017-02-13T19:28:14.283 回答