Hibernate SQLQuery list方法返回Object而不是object数组

时间:2017-08-09 07:27:21

标签: java hibernate hql

我对Hibernate SQLQuery.list()方法有这种奇怪的行为。

以下是问题说明:

我有一个sql select查询,它只从数据库中检索单个列(组)(即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个索引包含String对象而不是Object数组。
但是,如果我使用多个列,让我们在查询的select子句中说2列我能够看到结果的第0个索引作为Object数组,即Object[2]={"group","groupid"};

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

3 个答案:

答案 0 :(得分:1)

Docs州:

  

列表清单()

     

将查询结果作为List返回。如果查询包含多个     每行结果,结果在Object []的实例中返回。

自己转换,就像这样。

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

答案 1 :(得分:0)

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

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);
        }

答案 2 :(得分:0)

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

由于提到的list()方法返回的值在查询的select子句中包含单列的对象,并且我不允许从某个对象转换为Object [](Object array)。 相反,我尝试了下面的工作

已有代码

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);
      }

以上解决方案似乎适用于我的情况!