java - 将 List<Object[]> 转换为 List<String[]>

标签 java hibernate

我有一种从数据库获取联系人列表的方法。它返回一个列表

 public List<String[]> getContacts(String param) {
      ...
      Query q = this.getCurrentSession().createSQLQuery("
                   select first_name, last_Name, email_address, fax 
                   from contacts 
                   where first_name = :param");
      q.setParameter("param", param);
      List<String[]> listResult = q.list(); 
      return listResult;
 }

当我使用以下代码获取联系人姓名时:

 List<String[]> contacts = (ArrayList<String[]>) contactManager.getContacts(fistName);
 if (contacts != null && contacts.size() > 0) {
      person.setLastName(contacts.get(0)[1]); //error line
 }

我收到错误:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

我将源代码更改为:

 List<String[]> contacts = (ArrayList<String[]>) contactManager.getContacts(fistName);
 if (contacts != null && contacts.size() > 0) {
      Object[] objTemp = contacts.get(0);
      String temp = (String) objTemp[1];
      person.setLastName(temp);
 }

运行良好!

我已经调试过了,getContacts()函数返回的对象仍然是List。看起来对象刚刚转换为 List,当时错误行运行。

请帮我解释一下为什么第二个代码可以运行而没有错误。我认为两个来源的逻辑相同。

最佳答案

在这里您尝试显式转换:

List<String[]> contacts = (ArrayList<String[]>) contactManager.getContacts(fistName)

但是当你执行这个时:

contacts.get(0)[1]

它首先将数组的运行时类型(Object[])转换为 String[],如下所示:

Object[] colors = { "red", "green", "blue" };
String[] colorsStrings = (String[]) colors;   // -> class cast exception

你得到:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

它正确地告诉您正在尝试将 Object 数组 (Object[].class) 转换为 String 数组(String[].class)。

因此,您需要首先从列表中显式获取 Object[],然后将单个项目从 Object 转换为 String,如上一个示例所示。

如果您使用 Java 8,另一个选项是:

String[] contacts = Arrays.stream(contactManager.getContacts(fistName))
                          .toArray(String[]::new);

关于java - 将 List<Object[]> 转换为 List<String[]>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23560592/

相关文章:

java - Tomcat 正在提供内容类型为 "text/html"而不是 JNLP 内容类型的 JNLP 文件

java - 使用 Hibernate 与托管提供商创建 MySQL 数据库模式、优缺点、实践。

java - Hibernate - OneToMany 仅检索一行

hibernate - 如何使用 JPA 插件获取 Play Framework 2 中的 org.hibernate.cfg.Configuration

java - 如何在不获取完整实体的情况下获取依赖的 Hibernate 实体的外键列值?

mysql - 生成模式查询以在本地为 Spring MVC 项目设置 mysql 数据库

java - 如何在 mac 中运行 .jar?

java - 在 Java 中,如何在一定时间后结束递归?

java - Android 应用程序中读取的 CSV 文件

java - 服务器停止时从类路径读取文件