[Ljava.lang.Object; 无法转换为

34

我希望从数据库中获取值,在我的情况下,我使用List从数据库中获取值,但是出现了这个错误

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to id.co.bni.switcherservice.model.SwitcherServiceSource
at id.co.bni.switcherservice.controller.SwitcherServiceController.LoadData(SwitcherServiceController.java:48)
at id.co.bni.switcherservice.controller.SwitcherServiceController.main(SwitcherServiceController.java:62)

这是我的代码

    Query LoadSource = session_source.createQuery("select CLIENT,SERVICE,SERVICE_TYPE,PROVIDER_CODE,COUNT(*) FROM SwitcherServiceSource" +
            " where TIMESTAMP between :awal and :akhir" +
            " and PROVIDER_CODE is not null group by CLIENT,SERVICE,SERVICE_TYPE,PROVIDER_CODE order by CLIENT,SERVICE,SERVICE_TYPE,PROVIDER_CODE");
    LoadSource.setParameter("awal", fromDate);
    LoadSource.setParameter("akhir", toDate);

    List<SwitcherServiceSource> result_source = (List<SwitcherServiceSource>) LoadSource.list();
    for(SwitcherServiceSource tes : result_source){
        System.out.println(tes.getSERVICE());
    }

任何帮助都会很愉快 :)

@raffian,你是指像这样吗??

List<Switcher> result = (List<Switcher>) LoadSource.list();
for(Switcher tes : result){
    System.out.println(tes.getSERVICE());
}

@raffian 这是一个 Hibernate API 方法。 - Adarsh
这个问题会发生在每个select查询中吗? 当从查询中检索出一些字段而非全部字段时,我需要遵循Anikit Kulkarni提供的解决方案。 当从查询中检索出全部字段时,这不会成为一个问题。splatter_fadli - Ajay Takur
在我看来,Gleb S在下面提供的答案比被接受的还要好。 - Andrei Epure is hiring
6个回答

49
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to id.co.bni.switcherservice.model.SwitcherServiceSource

问题是:
(List<SwitcherServiceSource>) LoadSource.list();

这将返回一个对象数组(Object[])的列表,列表中每一列都有标量值,对应于SwitcherServiceSource表中的每一列。Hibernate会使用ResultSetMetadata来推断返回的标量值的实际顺序和类型。

解决方案

List<Object> result = (List<Object>) LoadSource.list(); 
Iterator itr = result.iterator();
while(itr.hasNext()){
   Object[] obj = (Object[]) itr.next();
   //now you have one array of Object for each row
   String client = String.valueOf(obj[0]); // don't know the type of column CLIENT assuming String 
   Integer service = Integer.parseInt(String.valueOf(obj[1])); //SERVICE assumed as int
   //same way for all obj[2], obj[3], obj[4]
}

相关链接


8
我曾经遇到过这样的问题,查阅了大量资料。为了避免不必要的迭代,你可以简单地调整你的hql查询语句:
你需要按照以下方式构建你的查询语句: select entity from Entity as entity where ... 同时,你也可以参考以下案例,它对我来说非常完美:
public List<User> findByRole(String role) {

    Query query = sessionFactory.getCurrentSession().createQuery("select user from User user join user.userRoles where role_name=:role_name");
    query.setString("role_name", role);
    @SuppressWarnings("unchecked")
    List<User> users = (List<User>) query.list();
    return users;
}

所以在这里,我们从查询中提取了对象,而不是一堆字段。而且它看起来更加美观。


1
这拯救了我的一天!在hql中缺少“select x”是关键。虽然我不需要强制转换(List<X>)。 - drWatson
是的,我确认不需要转换。 - Andrei Epure is hiring
找不到符号 method addEntity。我正在使用 Hibernate 包。有解决方法吗? - mercury

4
在调用query的.list()方法之前,您需要添加query.addEntity(SwitcherServiceSource.class)

在查询中添加实体后,对象已经正确转换了。谢谢啊! - User
非常感谢,你救了我。 - Mohammad Hashemi

2

您的查询执行将返回一个Object[]列表。

List result_source = LoadSource.list();
for(Object[] objA : result_source) {
    // read it all
}

我已经尝试过了,但是出现了这个错误 无法从元素类型Object转换为Object[] - splatter_fadli
调试并查找列表中的元素,或者您可以使用sout。 - vels4j
我认为问题出在这段代码 for(SwitcherServiceSource tes : result_source),我尝试使用“for each”从数据库中获取值,但失败了... 我认为列表中的元素是数组~ - splatter_fadli

0

在进行了大量研究后,我遇到了同样的问题,并找到了这个有效的解决方案。对于我的HQL查询,我想要获取POJO列表的输出,但我得到的是一个Object列表。 以下是如何获取您的POJO类列表。

有两种方法可以实现:

Query query = em.createNativeQuery(sqlQuery, Picking.class);
或者
Query query = em.createQuery(sqlQuery);

NativeQuery的工作示例:

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@PersistenceContext
protected EntityManager em;

private <T> List getPickingQuery(Map<String, String> searchFields, Map<String, String> orderByFields,
                                                      Pageable pageable, String status) {
    List resultList = new ArrayList();
    try {
        String sql = "select * from picking where status = '" + status + "'";
        String sqlQuery = createQuery(sql, searchFields, orderByFields);
        Query query = em.createNativeQuery(sqlQuery, Picking.class);

        setQueryParam(sqlQuery, searchFields);
        query.setMaxResults(pageable.getPageSize());
        query.setFirstResult((int) pageable.getOffset());
        log.info("Query " + query);
        resultList = query.getResultList();
    } catch (Exception e) {
        log.error("Error " + e.getMessage());
    }
    return resultList;
}

private String createQuery(String sql, Map<String, String> searchFields, Map<String, String> orderByFields) {
    for (String paramName : searchFields.keySet()) {
        sql = sql.concat(" and " + paramName + " = ?");
    }
    if (orderByFields != null) {
        if (orderByFields.containsKey("key") && orderByFields.containsKey("order"))
            sql = sql.concat(" order by " + orderByFields.get("key") + " " + orderByFields.get("order"));
        else if (orderByFields.containsKey("key"))
            sql = sql.concat(" order by " + orderByFields.get("key"));
    }
    return sql;
}

private void setQueryParam(String sqlQuery, Map<String, String> searchFields) {
    int param = 1;
    for (String paramName : searchFields.keySet()) {
        query.setParameter(param++, searchFields.get(paramName));
    }
}

0

如果要返回整个实体,Spring JPA 中更好的解决方案是使用 @Query(value = "from entity where Id in :ids")

这将返回实体类型而不是对象类型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接