java - 无法转换 HibernateTemplate.findByCriteria(criteria) 的 List<Object> 返回类型

标签 java hibernate hibernate-criteria

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

它正在返回 List,我正在尝试将其转换为 List,但它不允许我这样做。如何将 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>"
    }

最佳答案

首先,正如您已经注意到的,Java 没有将子类关系扩展到模板。这意味着如果你有两个类 AB , 其中B extends A , 然后 C<B>不是 C<A> 的子类,这正是编译器试图告诉你的。 oracle documentation也告诉你这件事。尽管 @laurentiu-l 链接到的“hack”有效,但您可能想要考虑这个替代解决方案,在我看来它不那么“hacky”:

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 完全禁止将子类型扩展到泛型。

关于java - 无法转换 HibernateTemplate.findByCriteria(criteria) 的 List<Object> 返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30391114/

相关文章:

java - hibernate中删除相关对象

java - 无法解析 : Lcom/google/common/collect/ImmutableMap; at com. my.app.di.DaggerMyApplicationComponent.getMapOfClassOfAndProviderOfFactoryOf(

java - 如何用 Spring + Hibernate + MySQL 实现搜索过滤器?

sql - NullHandling.NULLS_LAST 不起作用

java - 唯一索引或主键冲突

java - Hibernate Criteria 查询不查询一对多中的多

java - 有什么办法可以代替动态方法吗?

java - 在 java 中获取谷歌的电子邮件/用户名?

java - 从 SQL 查询生成案例表达式 - Criteria Builder、Criteria Query

java - Hibernate 嵌套属性标准