StringBuilder hql = new StringBuilder("from Trade where ")
.append("shop = ? ")
.append("and workStatus in (?) ");
List<Object> paramsList = new ArrayList<Object>();
paramsList.add(trade.getShop());

List<WorkStatus> workStatusList = new ArrayList<WorkStatus>();
workStatusList.add(WorkStatus.CLIENT);
workStatusList.add(WorkStatus.FINANCIAL);
paramsList.add(workStatusList);//paramsList.add(workStatusList);后面这个也不行    tradeDao.findByHql(hql.toString(), paramsList.toArray());
报的异常都是in后面的这个?的类型转换错误。
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Enum
用注释掉的会报
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.lang.Enum
at org.hibernate.type.EnumType.nullSafeSet(EnumType.java:148)

解决方案 »

  1.   

    你in里面只有一个问号,应该是你有几个in的数字就要有几个问号。
      

  2.   

    当前,类型也应该正确。看样子in里面应该是数字类型,而不是你的EnumType类.
      

  3.   

    不好意思,是我们的dao写错了,这个我们再看怎么改下,谢谢!!
      

  4.   

     for(int position = 0; position < params.length; position ++){
          query.setParameter(position, params[position]);
    }
    就是画红线的部分,解析有错,哪位大虾有什么解决方案没有呀。
      

  5.   


    你分开写,
    StringBuilder hql = new StringBuilder("from Trade where ")
    .append("shop = ? ")
    .append("and workStatus in ( ");   for(int i = 0;i < paramsList.size();i++ ){
    if(i > 0)
    hql.append(",");
    hql/append("'"+ paramsList.get(i).getFieldName +"'");
    }
    hql.append(")");
      

  6.   


    可以,你這樣寫的不對,不能直接傳數組。你在?中傳入一個字符串形式 "a,b,c,d,e"這樣的試試
      

  7.   

    你那样写不对,不能直接写一个?,无法直接传递数组的。需要按照如下来写.append(" AND workStatus  IN (");
              for (int i=0; i<workStatusList.size(); i++){
              if (i>0)
             hql.append(", ");
              hql.append("?");
                            paramsList.
                            add(workStatusList.get(i).toString());
              }
              hql.append(" )");
      

  8.   

    几位大是说的方法都试过了,首先要确定的是workStatus是enum类型,后面拼字符串,肯定会报类型转换错误;再有就是如果传List<WorkStatus>或WorkStatus[]进去,之前的类型又会被冲成list<Object>或Object[],也是会报类型转换错误,下面这种情况是可以的StringBuilder hql = new StringBuilder("from Trade where ")
    .append("and workStatus in (:workStatus) ");List<Object> paramsList = new ArrayList<Object>();
     //workStatus的值域
     List<WorkStatus> workStatusList = new ArrayList<WorkStatus>();
     workStatusList.add(WorkStatus.CLIENT);
     workStatusList.add(WorkStatus.FINANCIAL);paramsList.add(workStatusList);//paramsList.add(workStatusList.toArray());后面这个也不行tradeDao.findByHql(hql.toString(), paramsList.toArray());Dao中方法的参数为findByHql(final String hql,final Object ...params);
    如果dao中写成query.setParameter("workStatus", params[0]);这样子是对的,
    因为query.setParameter(String,Conllection)方法,
    而没有query.setParameter(int,Conllection),只有query.setParameter(int,Object)方法。
    还没想到什么好的方法,只有多写拼几个问号了。