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]);//错误行
}
依次