当 Hibernate 查询中有多个 bean 别名时,列表的返回类型是啥?

Posted

技术标签:

【中文标题】当 Hibernate 查询中有多个 bean 别名时,列表的返回类型是啥?【英文标题】:What is the return type of a list when there is more than one bean alias in the Hibernate query?当 Hibernate 查询中有多个 bean 别名时,列表的返回类型是什么? 【发布时间】:2017-03-25 12:19:39 【问题描述】:

有一个休眠查询:

@Override
@Transactional
public List<> getClassificationOfPta() 

    String hql = "select p , c from Pta p join p.classePta c where c.niveau = 2 order by p.creation";

    Session sessionDynamic = Utils.createDynamicSession(env);

    Query query = sessionDynamic.createQuery(hql);

    @SuppressWarnings("unchecked")
    List<> list = (List<>) query.list();

    sessionDynamic.close();

    return list;


那么在&lt;&gt; 里面写什么?

【问题讨论】:

【参考方案1】:

如果您保持原样查询,您将获得对象数组列表:List&lt;Object[]&gt;

数组的零索引将保存 Pta 实例,第一个索引将保存 ClassPta 实例。

在这种情况下,您必须手动解开该结果集。

有一种方法可以通过使用结果类来自动化该过程:

package com.myapp;

public class Result

     private Pta pta;
     private ClassPta classPta;

     public (Pta pta, ClassPta classPta)
          this.pta = pta;
          this.classPta = classPta;
    


那么您需要按如下方式更改查询和事务方法实现:

@Transactional
public List<Result> getClassificationOfPta() 

    String hql = "select new com.myapp.Result(p as pta, c as classPta) 
         from Pta p join p.classePta c where c.niveau = 2 order by p.creation";

    Session sessionDynamic = Utils.createDynamicSession(env);

    Query query = sessionDynamic.createQuery(hql);

    List<Result> list = (List<Result>) query.list();

    sessionDynamic.close();

    return list;


当然,第二种方法更干净,但你的电话是你的。

【讨论】:

以上是关于当 Hibernate 查询中有多个 bean 别名时,列表的返回类型是啥?的主要内容,如果未能解决你的问题,请参考以下文章

当 bean 类与一对多注释链接时,使用 hibernate 在 db 上选择查询:

记录使用Hibernate查询bean中字段和数据库列类型不匹配问题

hibernate中,怎么样同时查询多个表,连接查询

Hibernate SQL 查询结果 Mapping/Convert TO Object/Class/Bean

hibernate多对多查询

最近走过的坑 :slf4j 多个实现 hibernate 类型转换异常 bean依赖问题