Java 无法强制转换列表<;对象>;HibernateTemplate.findByCriteria的返回类型(条件)
我正在尝试使用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
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);