Hibernate SQLQuery 列表方法返回对象而不是对象数组

Posted

技术标签:

【中文标题】Hibernate SQLQuery 列表方法返回对象而不是对象数组【英文标题】:Hibernate SQLQuery list method returns Object instead of object array 【发布时间】:2017-08-09 07:27:20 【问题描述】:

我在使用 Hibernate SQLQuery.list() 方法时有这种奇怪的行为。

以下是问题描述:

我有一个 sql 选择查询,它只从数据库中检索单个列(组)(即select group from peopleGroup where groupid = 10) 我正在对象数组列表中收到上述列表的结果 即,

SQLQuery hQuery = session.createSQLQuery("select group from peopleGroup where groupid = 10");
List<Object[]> result = (List<Object[]>)hQuery.list();

理想情况下,结果应该包含对象数组的列表,但是当我检查时,结果的第 0 个索引包含字符串对象而不是对象数组。 但是,如果我在查询的 select 子句中使用多于一列,比如说 2 列,我能够将结果的第 0 个索引视为对象数组,即 Object[2]="group","groupid";

即使我在查询的 select 子句中只提到了一列,我如何获取 Object 数组?

【问题讨论】:

你不会..... 【参考方案1】:

Docs 状态:

列表列表()

以列表形式返回查询结果。如果查询包含多个 每行结果,结果在 Object[] 的实例中返回。

自己转换,像这样。

List<Object[]> l = new ArrayList<>();
for(Object o : query.list()) 
  Object[] arr = o;
  l.add(arr);

【讨论】:

我现在了解文档,但我是否有任何选项可以实现我的目标,即尽管我在 select 子句中有单列,但我需要将返回的对象放入对象数组中? 自行转换。添加示例。【参考方案2】:

你可以像下面的代码一样创建一个对象映射器

public class QueryMapper 
    private String group;
    //setter and getter
    

你必须像下面这样改变你的代码

SQLQuery hQuery = session.createSQLQuery("select group from peopleGroup where groupid = 10");
List<Object[]> result = (List<Object[]>)hQuery.list();

List<QueryMapper> list = new ArrayList<QueryMapper>();

        for(Object[] object: result)
            QueryMapper queryMapper = new QueryMapper();
            if(object[0]!=null)
                queryMapper.setGroup((String)object[2]);
            
            list.add(queryMapper);
        

【讨论】:

【参考方案3】:

我想要的只是修复在将 result.get(0) 分配给容器期间捕获的 ClassCastException,即 container = result.get(0);

由于提到的 list() 方法返回的值在查询的 select 子句中包含单列的情况下包含对象,并且不允许我从某个对象强制转换为 Object[](对象数组)。 相反,我尝试了如下解决方法

已经存在的代码

SQLQuery hQuery = session.createSQLQuery("select group from peopleGroup where groupid = 10");
List<Object[]> result = (List<Object[]>)hQuery.list();
Object[] container = result.get(0);

现在我已经设置了如下条件来决定如何为 Object[] 赋值

SQLQuery hQuery = session.createSQLQuery("select group from peopleGroup where groupid = 10");
List<Object[]> result = (List<Object[]>)hQuery.list();
Object[] container = null;
if(result.get(0) instanceof Object[])
   container = result.get(0);
else 
     container = new Object[1];
     container[0] = result.get(0);
      

上述解决方案在我的情况下似乎有效!

【讨论】:

以上是关于Hibernate SQLQuery 列表方法返回对象而不是对象数组的主要内容,如果未能解决你的问题,请参考以下文章

使用SQLQuery 在Hibernate中使用sql语句

hibernate的sqlQuery自动封装

Hibernate 关于执行sql查询语句(转)

什么 Hibernate 类型用于 SQLQuery 中的 Serializable 字段

笔记:Hibernate SQL 查询

hibernate框架学习之使用SQLQuery查询数据