0
点赞
收藏
分享

微信扫一扫

开发:hibernate的Criteria查询一个类继承已经映射的类出现java.lang.ClassCastException

妖妖妈 2022-03-11 阅读 64

问题说明:

下面是我项目中的实体类:

public class ​Questionnaire ​implements Serializable{....}

public class InuseQuestionnaire extends ​Questionnaire​{....}

两个类分别对应hibernate的配置文件(起始两个字段是相同的,只是为了数据的准确,防止原来数据变化引起历史数据变化):

Quesionnaire.hbm.xml和InuseQuesionnaire.hbm.xml

这样在用hibernate的​Criteria​查询时会出现以下异常:

java.lang.ClassCastException​: com.reader.entity.Questionnaire

    at org.hibernate.criterion.Example.getEntityMode(Example.java:278)

    at org.hibernate.criterion.Example.toSqlString(Example.java:208)

    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:380)

    at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:102)

    at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)

    at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:92)

    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1697)

    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)

原因:Java的类的类型是不可变,同级继承父类的类是不可相互转型的。

 Questionnaire quest= new InuseQuestionnaire ();

//这里会报错,虽然它们都继承了Questionnaire,却不能转型。

  InuseQuestionnaire iquest= (InuseQuestionnaire )quest;

解决方法:

一、​不要去继承这个已经被映射的类,将public class InuseQuestionnaire extends Questionnaire{....}改成public class InuseQuestionnaire implements Serializable{....}相应的属性写到这个类

二、​将公共的属性放到一个Base类中,然后分别继承

三、使用sql进行查询

举报

相关推荐

0 条评论