如何使用 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();
}
有人知道如何使用 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();
}