我有一个名为discount
有两列类型TIMESTAMP
named discount_start_date
and discount_end_date
在 MySQL 数据库中。因此,请根据表名和表中的相应列调整您的查询。
基于问题中给出的 SQL 语句的完整条件查询可以构造如下(我希望代码是不言自明的)。
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Discount> criteriaQuery = criteriaBuilder.createQuery(Discount.class);
Root<Discount> root = criteriaQuery.from(entityManager.getMetamodel().entity(Discount.class));
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
java.util.Date startDate = dateFormat.parse("24-02-2016");
java.util.Date endDate = dateFormat.parse("24-03-2016");
ParameterExpression<java.util.Date> parameter = criteriaBuilder.parameter(java.util.Date.class);
Predicate startDatePredicate = criteriaBuilder.greaterThanOrEqualTo(root.get(Discount_.discountStartDate).as(java.sql.Date.class), parameter);
Predicate endDatePredicate = criteriaBuilder.lessThanOrEqualTo(root.get(Discount_.discountEndDate).as(java.sql.Date.class), parameter);
Predicate startDateOrPredicate = criteriaBuilder.or(startDatePredicate, root.get(Discount_.discountStartDate).isNull());
Predicate endDateOrPredicate = criteriaBuilder.or(endDatePredicate, root.get(Discount_.discountEndDate).isNull());
Predicate and = criteriaBuilder.and(startDateOrPredicate, endDateOrPredicate);
criteriaQuery.where(and);
List<Discount> list = entityManager.createQuery(criteriaQuery)
.setParameter(parameter, startDate, TemporalType.DATE)
.setParameter(parameter, endDate, TemporalType.DATE)
.getResultList();
它会生成您感兴趣的以下 SQL 查询(如您所述,两个字段都包含在内)。
select
discount0_.discount_id as discount1_15_,
discount0_.discount_code as discount2_15_,
discount0_.discount_end_date as discount3_15_,
discount0_.discount_percent as discount4_15_,
discount0_.discount_start_date as discount5_15_
from
project.discount discount0_
where
(
cast(discount0_.discount_start_date as date)>=?
or discount0_.discount_start_date is null
)
and (
cast(discount0_.discount_end_date as date)<=?
or discount0_.discount_end_date is null
)
在 Hibernate 4.3.6 上进行测试,最终但平均的 ORM 框架应该生成相同的查询,无需任何修改。
在这个方法中setParameter(parameter, startDate, TemporalType.DATE)
,最后一个参数,即TemporalType.DATE
仅当您有一列类型时才需要DATETIME
or TIMESTAMP
在您的数据库中,您想要比较日期而忽略此类列的时间部分。如果您的列没有像这样的时间部分,您可以简单地排除该参数DATE
(MySQL)。
如有必要,您还可以使用其他日期(时间)处理 API,例如java.time
or JodaTime
替换Date
随着SimpleDateFormat