问题说明:
下面是我项目中的实体类:
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进行查询