如何使用 CriteriaBuilder Java 过滤日、月或两者

How to filter day, month or both using CriteriaBuilder Java

有人知道如何使用 CriteriaBuilder 创建过滤器吗?

我正在构建一个 api,我需要为列表方法创建一个过滤器。在 SQL 服务器数据库中,该列是一个小日期时间,解决我的问题的 SQL 查询如下:

SELECT * from TABLE 
where DAY(COLUMN) LIKE 10 AND MONTH(COLUMN) LIKE 5

我有一个 DTO class 用于过滤我的请求:

public class MyDTOFilter {
    private Integer day;
    private Integer month;
}

例如,如果某天给某天 = 5,我想要这样的回复:

“2020-01-05” “2020-02-05” "2019-10-05"...

如果同时给出,例如月 = 1 和日 = 10,我想要这样的回复:

"2020-01-10" 《2019-01-10》 "2018-01-10"...

我如何在 Java 中使用 CriteriaBuilder 执行此操作?

谢谢大家

由于 CriteriaBuilder 没有专门的数据库函数,您需要按名称调用此函数:

// DAY(COLUMN) returns an int
criteriaBuilder.function("DAY", Integer.class, "COLUMN")
// or, with JPA metamodel
criteriaBuilder.function("DAY", Integer.class, Entity_.column)

结果应该是这样的:

public List<LocalDate> findDates(int day, int month) {
  CriteriaQuery<LocalDate> query = criteriaBuilder.createQuery(LocalDate.class);
  Root<Entity> root = query.from(Entity.class);
  query.select(root.get(Entity_.column));
  List<Predicate> predicates = new ArrayList<>();
  ParameterExpression<Integer> dayParameter = null;
  ParameterExpression<Integer> monthParameter = null;
  if (day > 0) {
    dayParameter = criteriaBuilder.parameter(Integer.class);
    predicates.add(
      criteriaBuilder.equal(
        criteriaBuilder.function("DAY", Integer.class, root.get(Entity_.column)),
          dayParameter ));
  }
  if (month > 0) {
    monthParameter = criteriaBuilder.parameter(Integer.class);
    predicates.add(
      criteriaBuilder.equal(
        criteriaBuilder.function("MONTH", Integer.class, root.get(Entity_.column)),
        monthParameter ));
  }
  if (!predicates.isEmpty()) {
    query.where(criteriaBuilder.and(
      predicates.toArray(new Predicate[predicates.size()])));
  }
  TypedQuery<GregorianCalendar> typedQuery = getEntityManager().createQuery(query);
  if (dayParameter != null) {
    typedQuery.setParameter(dayParameter, day);
  }
  if (monthParameter != null) {
    typedQuery.setParameter(monthParameter, month);
  }
  return typedQuery.getResultList();
}