Hibernate5日期区间+多列查询失效,CriteriaAPI迁移求助
解决Hibernate 5+中CriteriaBuilder替代createCriteria的日期区间查询问题
没问题,我来帮你把旧的createCriteria写法转换成Hibernate 5.1.16推荐的CriteriaBuilder风格,确保你的dealerId匹配+日期区间查询逻辑完全生效。
正确的替代代码
// 获取CriteriaBuilder和CriteriaQuery实例 CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<GenerateInvoiceBean> query = builder.createQuery(GenerateInvoiceBean.class); Root<GenerateInvoiceBean> root = query.from(GenerateInvoiceBean.class); // 分别构建单个查询条件 Predicate matchDealer = builder.equal(root.get("dealerId"), dealerId); Predicate dateInRange = builder.between(root.get("billDate"), frDate, tDate); // 组合条件:同时满足两个条件 Predicate combinedConditions = builder.and(matchDealer, dateInRange); // 组装查询并执行 query.select(root).where(combinedConditions); List<GenerateInvoiceBean> gib = session.createQuery(query).list(); return gib;
关键细节说明(避免你踩坑)
- Root对象的泛型要正确:
Root<GenerateInvoiceBean>必须和你的实体类一致,不能省略泛型或者写错,否则会导致属性映射错误。 - 条件组合要明确:旧API的
add()方法默认是AND逻辑,但新API需要显式用builder.and()组合多个Predicate,如果你之前直接把多个条件丢进where()但没组合,可能会出现逻辑错误。 - 属性名要严格匹配:
root.get("billDate")里的字符串必须和GenerateInvoiceBean中对应的字段名完全一致(大小写敏感),比如实体里是billDate就不能写成billdate。 - 日期类型要匹配:确保
frDate、tDate的类型和实体中billDate的类型完全相同(比如都是java.util.Date或者java.time.LocalDate),类型不匹配会导致查询无结果或者抛出异常。
对比旧写法的逻辑对应
Restrictions.eq("dealerId", dealerId)→builder.equal(root.get("dealerId"), dealerId)Restrictions.between("billDate", frDate, tDate)→builder.between(root.get("billDate"), frDate, tDate)- 多个
add()组合条件 →builder.and(...)显式组合Predicate
内容的提问来源于stack exchange,提问作者Nizamuddin Shaikh
相关产品推荐
相关产品推荐

