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&lt;Object[]&gt;(不是 List&lt;String[]&gt;)(这就是异常消息的含义)。 解决了。我使用对象数组时得到了准确的结果:Object[] data = Thumbnailpaths.get(i); 【参考方案1】:

是的,在这种情况下,hibernate 将返回对象数组 (Object[]) - 返回多个列。但您仍然可以使用 "Entity queries" 返回实体对象而不是“原始”值。

【讨论】:

解决了。我使用对象数组来获取列表数据。 for (int i = 0 ; i【参考方案2】:

不幸的是,Hibernate 没有提供标准方法来检索表列的结果并直接存储到实体对象。您必须手动解析查询获取的数据。

休眠查询将返回对象数组列表,即List&lt;Object[]&gt;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的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate原生sql的查询,返回结果设置到DTO

Hibernate的批量查询——原生sql查询

hibernate多表联合查询返回的list没有数据,但list.isEmpty()判断为啥不为真

Hibernate-原生sql

Hibernate-原生sql

转: 在hibernate中查询使用list,map定制返回类型