无法转换List <object>返回类型的HibernateTemplate.findByCriteria(条件)

时间:2015-05-22 07:46:33

标签: java hibernate hibernate-criteria

我正在尝试使用HibernateTemplate.findByCriteria(条件)获取记录。

它正在返回List,我正在尝试将它转换为List,但它不允许我这样做。如何将列表转换为列表?

这是我的代码示例:

public List<User> getUserList(String status, String type)
    {
        DetachedCriteria joinCriteria = DetachedCriteria.forClass(UserDetails.class)
                                                        .add(Restrictions.eq("status", status));
        DetachedCriteria criteria = joinCriteria.createCriteria("user")
                                                .add(Restrictions.eq("type", type));


        return (List<User>) template.findByCriteria(criteria); // Gives error "Cannot cast from List<Object> to List<User>"
    }

1 个答案:

答案 0 :(得分:1)

首先,正如您已经注意到的那样,Java不会将子类关系扩展到模板。这意味着,如果您有两个类AB,其中B extends A,那么C<B>不是C<A>的子类,这正是编译器的内容试图告诉你。 oracle documentation也会告诉你这个问题。即使&#34; hack&#34;与@ laurentiu-l相关联的作品,您可能想要考虑这种替代解决方案,这种解决方案稍微少一点&#34; hacky&#34;在我看来:

final List<User> returnValue = new LinkedList<>();
for(Object user : template.findByCriteria(criteria)) {
  returnValue.add((User)user);
}
return returnValue;

关于Java为什么不将子类扩展到泛型的一些背景知识。假设它确实并考虑了以下三个类:

class Animal { }
class Dog extends Animal { }
class Cat extends Animal { }

现在我们编写以下代码:

List<Dog> dogList = new LinkedList<>();

// Perfectly fine, since Dog extends Animal
List<Animal> animalList = dogList;

// Fine again, since a Cat is an Animal, so we can put it in the list
animalList.add(new Cat());

// Oops...
Dog dog = dogList.get(0);

此代码可以完美编译,但在运行时抛出错误。为了避免这种并发症,Java完全禁止将这种子类型扩展到泛型。