Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法强制转换列表<;对象>;HibernateTemplate.findByCriteria的返回类型(条件)_Java_Hibernate_Hibernate Criteria - Fatal编程技术网

Java 无法强制转换列表<;对象>;HibernateTemplate.findByCriteria的返回类型(条件)

Java 无法强制转换列表<;对象>;HibernateTemplate.findByCriteria的返回类型(条件),java,hibernate,hibernate-criteria,Java,Hibernate,Hibernate Criteria,我正在尝试使用HibernateTemplate.findByCriteria(标准)获取记录 它正在返回列表,我正在尝试将它转换为列表,但它不允许我这样做。如何将列表转换为列表 下面是我的代码示例: public List<User> getUserList(String status, String type) { DetachedCriteria joinCriteria = DetachedCriteria.forClass(UserDetails.c

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

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

下面是我的代码示例:

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>"
    }
public List getUserList(字符串状态,字符串类型)
{
DetachedCriteria joinCriteria=DetachedCriteria.forClass(UserDetails.class)
添加(限制条件、情商(“状态”),状态);
DetachedCriteria=joinCriteria.createCriteria(“用户”)
.添加(限制。等式(“类型”,类型));
return(List)template.findByCriteria(criteria);//给出错误“无法从列表转换到列表”
}

首先,正如您已经注意到的,Java没有将子类关系扩展到模板。这意味着,如果您有两个类
A
B
,其中
B扩展了A
,那么
C
不是
C的子类,也会告诉您这一点。即使“HACK”链接到@劳伦蒂尔作品,你可能想考虑这个替代的解决方案,在我看来,这是一个有点“哈奇”:

final List<User> returnValue = new LinkedList<>();
for(Object user : template.findByCriteria(criteria)) {
  returnValue.add((User)user);
}
return returnValue;
现在我们编写以下代码:

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);
List dogList=newlinkedlist();
//很好,因为狗延伸到动物身上
列表动物列表=狗列表;
//很好,因为猫是动物,所以我们可以把它列入清单
添加(新猫());
//哎呀。。。
Dog Dog=dogList.get(0);

这段代码可以完美地编译,但在运行时会抛出一个错误。为了避免这种复杂情况,Java刚刚完全禁止将子类型扩展到泛型。

我认为您不需要强制执行此强制转换@Chintan Patel post complete exception stack trace,这似乎与您构建的标准有关。变量
模板
来自何处?@LaurentiuL。您的技巧奏效了。谢谢:)很好的解释,亚历山大。我知道这个事实,但只是暂时略过。但是你解释得很好。现在我再也不会忘记它了。谢谢:)
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);