CriteriaQuery 年月过滤器
CriteriaQuery month and year filter
我正在尝试在包含一列日期 (Oracle 11G) 的模型中进行条件查询 (JPA/Hibernate)。例如,我有
- 2009 年 1 月 13 日
- 2009 年 1 月 15 日
- 2009 年 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" 过滤,它应该 return:
- 2009 年 1 月 13 日
- 2009 年 1 月 15 日
非常感谢任何帮助,
提前致谢。
我假设您得到的日期值类似于 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。
您可以使用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)
);
我正在尝试在包含一列日期 (Oracle 11G) 的模型中进行条件查询 (JPA/Hibernate)。例如,我有
- 2009 年 1 月 13 日
- 2009 年 1 月 15 日
- 2009 年 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" 过滤,它应该 return:
- 2009 年 1 月 13 日
- 2009 年 1 月 15 日
非常感谢任何帮助, 提前致谢。
我假设您得到的日期值类似于 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。
您可以使用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)
);