You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:45:07