我从query.list()
获取了一个列表。之后,我想在此列表中显示该对象,但是此行for(Commerce[] c: this.newsList) {
java.lang.ClassCastException:[Ljava.lang.Object;不能投[Lcom.model.Commerce; com.action.CommerceAction.searchCommerces(CommerceAction.java:35)
这是我的代码:
我的商业服务
public List<Commerce[]> getCommercesBySearch(String categorie, String lieux) {
Query query = hibUtil.getSession().createQuery("from Commerce c, Categorie ca,Lieux l "
+ "where c.categorie=ca.idCategorie and c.lieux=l.idLieux and"
+ " ca.libelle='" + categorie + "' and l.ville='" + lieux + "' ");
List<Commerce[]> tuples = (List<Commerce[]>) query.list();
return tuples;
}
我的动作类
private CommerceService service;
private Commerce commerce = new Commerce();
private List<Commerce[]> newsList;
public String searchCommerces() {
String libelle = ServletActionContext.getRequest().getParameter("libelle");
String ville = ServletActionContext.getRequest().getParameter("ville");
this.newsList = service.getCommercesBySearch(libelle,ville);
for(Commerce[] c: this.newsList){
System.out.println(c[0].getNom());
}
if (this.newsList.size() > 0) {
return SUCCESS;
}
addActionError("Il n'existe aucun commerce de cette catégorie dans cette ville");
return ERROR;
}
答案 0 :(得分:5)
我确信这句话:
List<Commerce[]> tuples = (List<Commerce[]>) query.list();
生成未经检查的类型转换警告。 通过执行此未经检查的类型转换,您的代码为polluting the heap。 query.list()
返回原始List
,其中包含Object[]
。这是relevant Hibernate documentation:
将查询结果作为
的实例中返回List
返回。如果查询每行包含多个结果,则结果将在Object[]
。
Note that you cannot cast an array to an array of it's sub-type.
有几种方法可以解决此问题:
List<Object[]>
代替List<Commerce[]>
。然后,您可以将list()
方法的结果转换为更可用的形式,最好是在自己的方法中,然后再将其传递给代码的其余部分。如果您需要选择的不仅仅是Commerce
对象,那么这是更好的方法。SELECT c
添加到查询的开头,这样您就可以进行安全的List<Commerce>
广告投放。答案 1 :(得分:2)
在select c
之前使用from
,否则您在返回Object[]
时会遇到一些问题。如果你不使用它,Hibernate将返回一个包含多个对象的Object []列表。对于你的问题,它将是:
Object[0]
是Commerce
Object[1]
是Categorie
Object[3]
是Lieux
如果您尝试将ClassCastException
投射到Object[]
,则会抛出Commerce
。
答案 2 :(得分:1)
我认为问题在于:
Query query = hibUtil.getSession().createQuery("from Commerce c, Categorie ca,Lieux l "
+ "where c.categorie=ca.idCategorie and c.lieux=l.idLieux and"
+ " ca.libelle='" + categorie + "' and l.ville='" + lieux + "' ");
List<Commerce[]> tuples = (List<Commerce[]>) query.list();
考虑到你的想法,这是不正确的。我相信您的查询应该返回List<Commerce>
,而不是List<Commerce[]>
。
List<Commerce> tuples = (List<Commerce>) query.list();
要使其有效,您需要在查询中添加 SELECT c :
SELECT c from Commerce c, Categorie ca,Lieux l...
它将选择对象Commerce
的列表。如果你保留最初的查询,它将返回一个Object数组列表(实际上它们是Commerce [],Categorie [],Lieux [] ......)。更不用说你不能直接在Java中转换数组了,反正的对象也不一样。