【问题标题】:Hibernate SQLQuery list method returns Object instead of object arrayHibernate SQLQuery 列表方法返回对象而不是对象数组
【发布时间】: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 数组?

【问题讨论】:

  • 你不会.....

标签: java hibernate hql


【解决方案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);
          }
    

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

    【讨论】:

      猜你喜欢
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      相关资源
      最近更新 更多