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

Hibernate Criteria关联查询:如何返回B对象列表?

如何用Hibernate Criteria查询返回List

当然可行!你当前的代码返回List<A>是因为根查询对象是A.class,Hibernate默认会返回根实体的实例,哪怕你关联了B属性。下面给你两种适配Java 1.7的可行解决方案:

方法一:通过投影与结果转换器获取B实例

这种方法适合你需要从A的关联关系中筛选B的场景,核心是通过投影指定要返回的B属性,再用结果转换器把投影结果映射为B对象:

Criteria criteria = getSession().createCriteria(A.class, "a")
    // 关联A中的b属性,取别名"b"方便后续投影引用
    .createAlias("a.b", "b")
    // 投影B的所有属性,注意别名要和B类的属性名严格一致
    .setProjection(Projections.projectionList()
        .add(Projections.property("b.id"), "id")
        .add(Projections.property("b.name"), "name"))
    // 将投影结果转换为B类实例
    .setResultTransformer(new AliasToBeanResultTransformer(B.class));

return criteria.list(); // 此时返回的是List<B>

注意事项:

  • 确保B类有公开的无参构造器,并且id、name属性有对应的setter方法,AliasToBeanResultTransformer需要通过反射注入属性值。
  • 如果你的Hibernate版本是4.3及以上,也可以用Transformers.aliasToBean(B.class)替代AliasToBeanResultTransformer,功能完全一致。

方法二:直接以B为根查询(无需A过滤时更简单)

如果你只是想获取所有B对象,或者可以通过B的反向关联来添加过滤条件,直接把根查询对象设为B.class会更简洁:

// 直接以B为根创建Criteria
Criteria criteria = getSession().createCriteria(B.class);
// 若需要基于A的条件过滤(比如A的name等于某个值),可以添加关联与限制:
// criteria.createAlias("a", "a").add(Restrictions.eq("a.name", "目标名称"));

return criteria.list(); // 直接返回List<B>

为什么原来的代码返回List?

你之前的代码createCriteria(A.class,"a").createCriteria("b")本质是内连接A和B,但根实体始终是A,所以Hibernate会返回A的实例集合——每个A对象的b属性会被加载,但集合的元素类型还是A。

内容的提问来源于stack exchange,提问作者C.B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:50:59