如何使用Java 8 Lambda正确重构HibernateCallback示例代码?
用Java 8 Lambda重构HibernateCallback匿名内部类
嘿,这个场景我太熟悉了!原来的代码里用的HibernateCallback是个标准的函数式接口(只有一个抽象方法doInHibernate),刚好适配Java 8的Lambda表达式,能把那些冗余的匿名内部类模板代码全部干掉。
先把你给出的原代码片段补全(假设后面是关联查询的逻辑):
// 原匿名内部类写法 hibernateTemplate.execute(new HibernateCallback<HumanMainInfo>() { @Override public HumanMainInfo doInHibernate(Session session) throws HibernateException { CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<HumanMainInfo> query = builder.createQuery(HumanMainInfo.class); Root<SysUserMainInfo> sysUserRoot = query.from(SysUserMainInfo.class); // 示例关联逻辑 Join<SysUserMainInfo, HumanMainInfo> humanJoin = sysUserRoot.join("humanMainInfo"); query.select(humanJoin); // 执行查询并返回结果 return session.createQuery(query).uniqueResult(); } });
重构后的Lambda版本
// Lambda简化写法 hibernateTemplate.execute(session -> { CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<HumanMainInfo> query = builder.createQuery(HumanMainInfo.class); Root<SysUserMainInfo> sysUserRoot = query.from(SysUserMainInfo.class); // 保留你原来的关联、查询条件等业务逻辑 Join<SysUserMainInfo, HumanMainInfo> humanJoin = sysUserRoot.join("humanMainInfo"); query.select(humanJoin); return session.createQuery(query).uniqueResult(); });
几个关键说明:
- 函数式接口适配:
HibernateCallback只有一个必须实现的抽象方法,符合Lambda的使用条件,所以可以直接用session -> { ... }替代整个匿名内部类 - 类型推断:Java编译器会自动推断Lambda参数的类型(这里是
Session session),你甚至可以省略参数类型写成(session) -> { ... },单参数时连括号都能省:session -> { ... } - 异常处理:原代码里的
throws HibernateException不用在Lambda里显式声明,因为HibernateException是运行时异常,Lambda会自动向上传递,不会破坏代码的异常处理逻辑 - 代码简洁性:如果你的查询逻辑非常简短(比如一行就能写完),还可以进一步简化成无大括号的写法,比如:
但逻辑复杂时,保留大括号和显式hibernateTemplate.execute(session -> session.createQuery(builder.createQuery(HumanMainInfo.class)).uniqueResult());return会让代码更易读。
内容的提问来源于stack exchange,提问作者MIsmail
相关产品推荐
相关产品推荐

