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.
相关产品推荐
相关产品推荐

