1

リストがあり、それを反復する必要があります。イテレーターまたは for ループを使用した後でもクラスキャスト例外が発生し、次のような問題が発生します。

コードは次のとおりです。

List<DataLoaderIndex> dataList = new ArrayList<DataLoaderIndex>();

dataList = dataLoaderIndexDAO.getDataSourceStatus(uploadFrequency,reportEndDate);

Map<String,String> mapData = new HashMap<String,String>();

Iterator<DataLoaderIndex> itrObj = dataList.iterator();
            while (itrObj.hasNext()) {
                DataLoaderIndex dlObj = itrObj.next();
                String dsName = dlObj.getDataSourceType();
                    String dsStatus = dlObj.getStatus();
                    mapData.put(dsName, dsStatus);

            }

/*for(int i=0;i<dataList.size();i++){
             String dsName = dataList.get(i).getDataSourceType();
             String dsStatus = dataList.get(i).getStatus();
             mapData.put(dsName, dsStatus);
         }*/

DAO の部分は次のとおりです。

public List<DataLoaderIndex> getDataSourceStatus(String uploadFrequency,String reportEndDate){


    List<DataLoaderIndex> dataList = null;
    if(session!=null){
        Query query = session.createQuery("select dataSourceType,uploadedBy,status from DataLoaderIndex where DATE (reportEndDate) =:endate and UPPER(reportFreq) = UPPER(:uploadFreq)");  
        query.setString("endate", reportDate);
        query.setString("uploadFreq", uploadFrequency);
        dataList = query.list();
    }

    return dataList;
}

行の例外が発生します

String dsName = dlObj.getDataSourceType(); 

...

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.work.in.synct.entity.DataLoaderIndex
    at com.work.synct.service.dataloaderimpl.DataUploadDetailsService.getUploadStatus(DataUploadDetailsService.java:36)
4

1 に答える 1

0

DAOメソッドでは、クエリは を使用して厳密に型指定する必要がありますTypedQuery。クエリは現時点では入力されていないため、型の消去により にList<Object[]>割り当てることができる を返しています。dataList実行時List<DataLoaderIndex>に型情報が失われるため、List<Object[]>.

List<DataLoaderIndex> dataList = null;
if(session!=null){
    TypedQuery<DataLoaderIndex> query = session.createQuery("select dataSourceType," +
        "uploadedBy,status from DataLoaderIndex where DATE " +
           " (reportEndDate) =:endate and UPPER(reportFreq) = UPPER(:uploadFreq)", 
              DataLoaderIndex.class);


    query.setString("endate", reportDate);
    query.setString("uploadFreq", uploadFrequency);
    dataList = query.list();
}

return dataList;

アップデート

JPAを使用していないことに気づきました。代わりに、DAO メソッドで返されたリストをキャストしてみてください。ある時点で、タイプにアップキャストする必要がありますList<DataLoaderList>

dataList = (List<DataLoaderList>)query.list();

于 2013-09-03T09:33:47.483 に答える