[Ljava.lang.Object;不能被误导

时间:2015-03-31 15:18:56

标签: java hibernate

我从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;
    }

3 个答案:

答案 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.

有几种方法可以解决此问题:

  1. 使用List<Object[]>代替List<Commerce[]>。然后,您可以将list()方法的结果转换为更可用的形式,最好是在自己的方法中,然后再将其传递给代码的其余部分。如果您需要选择的不仅仅是Commerce对象,那么这是更好的方法。
  2. 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中转换数组了,反正的对象也不一样。