Hibernate原生查询返回List Object List
Posted
技术标签:
【中文标题】Hibernate原生查询返回List Object List【英文标题】:Hibernate native query return List Object List 【发布时间】:2016-09-09 09:02:00 【问题描述】:我正在使用一个休眠 NQL 查询,它获取我两列:
SELECT object_name,
object_name_location
FROM dbo.object_stacks
WHERE object_id IN (SELECT thumb_nail_obj_id
FROM dbo.uois
WHERE Upper(NAME) LIKE Upper('%testobj%'))
当我只选择一列时,即只选择对象名称 - 一切正常,但有两列时出现错误
java.lang.ClassCastException: [Ljava.lang.Object;不能转换为 java.lang.String
在运行时我尝试显示列表中的结果。我也尝试在列表中使用字符串数组,但它不起作用。下面是我的代码 sn-ps 给出错误:
当我只使用 List 时:
List<String> Thumbnailpaths = pathquery.list();
System.out.println(Thumbnailpaths.get(i).replace("\\", "\\\\"));
编译时没有错误,如果保持原样,但在上面显示的行会给出类转换异常。
当我使用列表数组时:
List<String[]> Thumbnailpaths = pathquery.list();
System.out.println(Thumbnailpaths.get(i)[0].replace("\\", "\\\\"));
这里又是运行时的classcast异常
另外,Criteria.ALIAS_TO_ENTITY_MAP
也无济于事,因为它使逻辑更加复杂。我只需要数据库表中的 2 个列值。
如果有任何解决方案可以在 NQL 中获取多列结果然后放入列表中,请告诉我。
注意:这里似乎没有显示泛型,我的代码 sn-p 中只写了 List
【问题讨论】:
当您尝试从数据库返回元组列表时,查询返回List<Object[]>
(不是 List<String[]>
)(这就是异常消息的含义)。
解决了。我使用对象数组时得到了准确的结果:Object[] data = Thumbnailpaths.get(i);
【参考方案1】:
是的,在这种情况下,hibernate 将返回对象数组 (Object[]) - 返回多个列。但您仍然可以使用 "Entity queries" 返回实体对象而不是“原始”值。
【讨论】:
解决了。我使用对象数组来获取列表数据。 for (int i = 0 ; i不幸的是,Hibernate 没有提供标准方法来检索表列的结果并直接存储到实体对象。您必须手动解析查询获取的数据。
休眠查询将返回对象数组列表,即List<Object[]>
。
Object[]
将包含来自您的列的数据。列表只不过是通过查询检索到的行。在您的情况下,您可以参考以下代码:
List<Object[]> Thumbnailpaths = pathquery.list();
for(Object[] objArr : Thumbnailpaths)
String objName = (String)objArr[0];
String objNameLocation = (String)objArr[1];
System.out.println(objName + " : " +objNameLocation);
以上代码将帮助您解析object[]
【讨论】:
以上是关于Hibernate原生查询返回List Object List的主要内容,如果未能解决你的问题,请参考以下文章