如何为Hibernate 3编写Java Criteria Query实现日期区间查询
Hibernate 3 Criteria Query: 实现created_at日期范围筛选
嘿,我来帮你补全这个Criteria Query,实现你要的日期范围筛选逻辑——从some_table(对应实体MyEntity)中查询created_at介于当前日期减8天到当前日期减2天之间的数据。
基于你给出的JPA CriteriaBuilder初始代码,补全后的完整实现:
CriteriaBuilder builder = sessionFactory.getCriteriaBuilder(); CriteriaQuery<MyEntity> criteria = builder.createQuery(MyEntity.class); Root<MyEntity> root = criteria.from(MyEntity.class); // 调用MySQL的DATE_SUB函数,计算8天前和2天前的日期 Expression<Date> eightDaysAgo = builder.function( "DATE_SUB", Date.class, builder.currentDate(), builder.literal(8), builder.literal("DAY") ); Expression<Date> twoDaysAgo = builder.function( "DATE_SUB", Date.class, builder.currentDate(), builder.literal(2), builder.literal("DAY") ); // 创建日期区间筛选条件:created_at介于两个日期之间 Predicate dateRangePredicate = builder.between(root.get("createdAt"), eightDaysAgo, twoDaysAgo); // 将筛选条件添加到查询中 criteria.where(dateRangePredicate); // 执行查询并获取结果(如果需要执行的话) TypedQuery<MyEntity> query = sessionFactory.createEntityManager().createQuery(criteria); List<MyEntity> results = query.getResultList();
代码说明:
- 用
builder.function()直接调用数据库的DATE_SUB函数,确保逻辑和你给出的SQL完全一致; builder.currentDate()获取数据库的当前日期,和SQL里的curdate()对应;root.get("createdAt")对应实体中映射created_at字段的属性名(JPA默认驼峰转下划线,所以实体属性名如果是createdAt,会自动映射到数据库的created_at);- 最后通过
TypedQuery执行查询,拿到符合条件的MyEntity列表。
如果你用的是Hibernate原生的Criteria API(而非JPA Criteria),写法会更简洁:
// 假设你已经获取了Hibernate Session Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(MyEntity.class); // 计算日期区间(可借助Apache Commons Lang的DateUtils,或自行实现日期加减) Date eightDaysAgo = DateUtils.addDays(new Date(), -8); Date twoDaysAgo = DateUtils.addDays(new Date(), -2); // 添加区间筛选条件 criteria.add(Restrictions.between("createdAt", eightDaysAgo, twoDaysAgo)); // 执行查询 List<MyEntity> results = criteria.list();
内容的提问来源于stack exchange,提问作者MUJEEB
相关产品推荐
相关产品推荐

