Java 演员名单<;对象[]>;列出<;字符串[]>;

Java 演员名单<;对象[]>;列出<;字符串[]>;,java,hibernate,Java,Hibernate,我有一个从数据库中获取联系人列表的方法。它返回一个列表 public List<String[]> getContacts(String param) { ... Query q = this.getCurrentSession().createSQLQuery(" select first_name, last_Name, email_address, fax from cont

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

 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;
 }
public List getContacts(字符串参数){
...
Query q=this.getCurrentSession().createSQLQuery(“
选择姓名、姓氏、电子邮件地址、传真
来自联系人
其中first_name=:param“;
q、 设置参数(“参数”,参数);
List listResult=q.List();
返回列表结果;
}
当我使用以下代码获取联系人姓名时:

 List<String[]> contacts = (ArrayList<String[]>) contactManager.getContacts(fistName);
 if (contacts != null && contacts.size() > 0) {
      person.setLastName(contacts.get(0)[1]); //error line
 }
List contacts=(ArrayList)contactManager.getContacts(fistName);
if(contacts!=null&&contacts.size()>0){
person.setLastName(contacts.get(0)[1]);//错误行
}
我得到一个错误:

java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为 [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);
 }
List contacts=(ArrayList)contactManager.getContacts(fistName);
if(contacts!=null&&contacts.size()>0){
Object[]objTemp=contacts.get(0);
字符串温度=(字符串)对象温度[1];
person.setLastName(临时);
}
它跑得很好

我已经调试过了,从getContacts()函数返回的对象仍然是列表。看起来像是在错误行运行时刚刚转换到列表的对象


请帮助我解释为什么第二个代码可以无错误地运行。我认为两个源的逻辑相同。

在这里,您尝试显式强制转换:

List<String[]> contacts = (ArrayList<String[]>) contactManager.getContacts(fistName)
它首先将数组的运行时类型(对象[])转换为字符串[],如:

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;
这正确地表明您正试图将
对象
s(
对象[].class
)的数组强制转换为
字符串
s(
字符串[].class
)的数组

因此,您需要首先从列表中显式地获取对象[],然后将单个项从对象强制转换为字符串,如上一个示例所示

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

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

在这里,您尝试显式强制转换:

List<String[]> contacts = (ArrayList<String[]>) contactManager.getContacts(fistName)
它首先将数组的运行时类型(对象[])转换为字符串[],如:

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;
这正确地表明您正试图将
对象
s(
对象[].class
)的数组强制转换为
字符串
s(
字符串[].class
)的数组

因此,您需要首先从列表中显式地获取对象[],然后将单个项从对象强制转换为字符串,如上一个示例所示

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

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

问题是您没有遵循警告。一切从这里开始:

 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;
 }
public List getContacts(字符串参数){
Query q=this.getCurrentSession().createSQLQuery(“选择first_name、last_name、email_address、fax from contacts,其中first_name=:param”);
q、 设置参数(“参数”,参数);
List listResult=q.List();
返回列表结果;
}
List listResult=q.List();
这应该会给你一个警告

类型列表的表达式需要未经检查的转换才能符合列表

我们可以用一些在引擎盖下运行的示例代码来代替它

公共列表getContacts(字符串参数){

Object[]data=新对象[3];
数据[0]=“字符串”;
列表结果=新建ArrayList();
结果.添加(数据);
返回结果;
}

如您所见,hibernate创建了一个没有定义类型的列表,并将对象[]数组放入其中

由于Java在编译过程中删除了所有通用参数,因此您的代码看起来更像这样

 public List<Object[]> 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<Object[]> listResult = q.list(); 
      return listResult;
 }
public List getContacts(字符串参数){
Query q=this.getCurrentSession().createSQLQuery(“选择first_name、last_name、email_address、fax from contacts,其中first_name=:param”);
q、 设置参数(“参数”,参数);
List listResult=q.List();
返回列表结果;
}

List contacts=(ArrayList)contactManager.getContacts(fistName);//注意此转换不是必需的
if(contacts!=null&&contacts.size()>0){
person.setLastName(contacts.get(0)[1]);//错误行
}
结果,您将一个对象传递给期望字符串的方法。这就是为什么当您将其展开并手动强制转换时,它可以工作的原因

使用Dileep建议的解决方案

List<String> listResult = q.setParameter("param", param).setResultTransformer(Transformers.aliasToBean(String.class)).list();
List listResult=q.setParameter(“param”,param).setResultTransformer(Transformers.aliasToBean(String.class)).List();

问题在于您没有遵循警告。一切从这里开始:

 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;
 }
public List getContacts(字符串参数){
Query q=this.getCurrentSession().createSQLQuery(“选择first_name、last_name、email_address、fax from contacts,其中first_name=:param”);
q、 设置参数(“参数”,参数);
List listResult=q.List();
返回列表结果;
}
List listResult=q.List();
这应该会给你一个警告

类型列表的表达式需要未经检查的转换才能符合列表

我们可以用一些在引擎盖下运行的示例代码来代替它

公共列表getContacts(字符串参数){

Object[]data=新对象[3];
数据[0]=“字符串”;
列表结果=新建ArrayList();
结果.添加(数据);
返回结果;
}

如您所见,hibernate创建了一个没有定义类型的列表,并将对象[]数组放入其中

由于Java在编译过程中删除了所有通用参数,因此您的代码看起来更像这样

 public List<Object[]> 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<Object[]> listResult = q.list(); 
      return listResult;
 }
public List getContacts(字符串参数){
Query q=this.getCurrentSession().createSQLQuery(“选择first_name、last_name、email_address、fax from contacts,其中first_name=:param”);
q、 设置参数(“参数”,参数);
List listResult=q.List();
返回列表结果;
}

List contacts=(ArrayList)contactManager.getContacts(fistName);//注意此转换不是必需的
if(contacts!=null&&contacts.size()>0){
person.setLastName(contacts.get(0)[1]);//错误行
}
依次