我对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数组?
答案 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);
}
以上解决方案似乎适用于我的情况!