【问题标题】:[Ljava.lang.Object; cannot be cast to[Ljava.lang.Object;不能转换为
【发布时间】:2013-12-27 12:11:17
【问题描述】:

我想从数据库中获取值,在我的情况下,我使用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 这是一个休眠 API 方法。
  • 每个选择查询都会出现这个问题吗?当从查询中检索到某些字段时,我吸收遵循 Anikit Kulkarni 提供的解决方案。当从查询中检索到整个字段时,这不会是一个问题 splatter_fadli
  • 下面提供的答案 Gleb S 比公认的要好,imo stackoverflow.com/questions/20486641/…

标签: java hibernate hql


【解决方案1】:
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]
}

相关链接

【讨论】:

    【解决方案2】:

    我遇到过这样的问题并挖掘了各种材料。所以,为了避免丑陋的迭代,你可以简单地调整你的 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;
    }
    

    所以这里我们从查询中提取object,而不是一堆字段。而且它看起来更漂亮。

    【讨论】:

    • 这拯救了我的一天!缺少 hql 中的“select x”是关键。不过,我不需要强制转换 (List)。
    • 是的,我确认不需要演员表
    【解决方案3】:

    您需要在查询时调用 .list() 之前添加 query.addEntity(SwitcherServiceSource.class)

    【讨论】:

    • 在查询中添加实体后,对象已正确转换。谢谢大佬!
    • 非常感谢,你救了我?
    【解决方案4】:

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

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

    【讨论】:

    • 我试过了,我得到了这个错误cannot convert from element type Object to Object[]
    • 调试并找到列表中的元素是什么,或者你可以做sout。
    • 我认为问题出在此代码for(SwitcherServiceSource tes : result_source),我尝试使用“for each”从数据库中获取值但失败了...我认为列表中的元素是数组~
    【解决方案5】:

    如果要返回整个实体,则使用 Spring JPA 中的更好解决方案 @Query(value = "来自 ID 在 :ids 中的实体")

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

    【讨论】:

      【解决方案6】:

      在大量研究发现这个可行的解决方案后,我遇到了同样的问题。 对于我的 HQL 查询,我想获得 POJO 列表的输出,但我得到的是 Object 列表。 这是获取 POJO 类列表的方法。

      可以通过两种方式实现:

      Query query = em.createNativeQuery(sqlQuery, Picking.class);
      OR
      查询查询 = 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));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-04-26
        • 2012-05-01
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-18
        • 2014-05-09
        相关资源
        最近更新 更多