java,jpa强制转换异常

时间:2012-11-08 10:23:47

标签: java jpa casting

这是我第二次和jpa一起玩,

我写了这段代码:

   String queryString = "SELECT e.uidprofile, e.profilecode, e.catUso, max(e.zonaClim), e.classePrev, e.beta1, e.beta2, e.beta3, e.beta4"
            + " FROM "
            +  entityClass.getSimpleName()
            + " e "
            + " WHERE e.catUso like :code "
            + " group by e.uidprofile, e.profilecode, e.catUso, e.classePrev, e.beta1, e.beta2, e.beta3, e.beta4"
            + " order by e.uidprofile";

    Query query = entityManager.createQuery(queryString);

    query.setParameter("code", "C" + "%");

    List<SamTbProfileMapping> resultList = query.getResultList();

    ClassLoader c1 = this.getClass().getClassLoader();
    ClassLoader c2 = resultList.getClass().getClassLoader();

    if(resultList.size()>0){
        System.out.println(resultList.get(0).getCatUso());
    }

调试它:

  • resultList包含SamTbProfileMapping的所有字段,其中包含正确的值
  • 对象的数量是对的
  • 在行List<SamTbProfileMapping> resultList = query.getResultList();之后
  •   我得到C2nullSystem.out.println(resultList.get(0).getCatUso());   表示无法将结果列表转换为SamTbProfileMapping

2 个答案:

答案 0 :(得分:2)

我认为你应该使用typed version of the createQuery function(可从1.6获得)

尝试:

Query query = entityManager.createQuery(queryString, SamTbProfileMapping.class);

当然,这意味着SamTbProfileMapping必须是实体类。而且我不确定聚合列,您可能需要为其应用别名。

答案 1 :(得分:2)

您正在使用查询检索数组列表。不是对象列表。

"Select a, b, c, d, from something" - 返回List<Object[]>

然后以与查询相同的顺序访问单独的成员。 例如:

 List<Object[]> myList = query.getResultList();

 MyAClass a1 = (MyAClass) myList.get(0)[0];
 MyBClass b1 = (MyBClass) myList.get(0)[1];

要选择对象列表,您可以使用:

"select a from MyClass a where ..."

然后

 List<MyClass> myList = query.getResultList();
 MyClass result1 = myList.get(0);