大家好,我正在尝试开发一个单一的 Java 类,它可以作为 org.hibernate.Criteria 之类的包装器,以优雅的方式摆脱一堆添加(限制)。这是我到目前为止得到的遗留系统。
public static void prepareForSelect(Criteria crit) {
crit.add(Restrictions.eq("cid","1"));
crit.add(Restrictions.eq("did","2");
crit.add(Restrictions.eq("fdl","3")); //omit for brevity
}
是的,这是非常不充分的,我知道我正在尝试实现一个扩展 org.hibernate.internal.CriteriaImpl 的 java 类,并具有我需要限制并且我想要的属性。这个类有这样的方法。
public org.hibernate.Criteria addStandartsRestrictions(){
return this.add(Restrictions.eq("cid",getCid())).add(Restrictions.eq("did",getDid())).add(Restrictions.eq("fdl",getFdl()));
}
在我的java代码中这样调用它:
org.hibernate.Criteria myOwnCriteria = ((FullCriteria)Session.getSession().createCriteria(MyJava.class)).addStandartsRestrictions();
但我遇到以下异常
Exception in thread "main" java.lang.ClassCastException: org.hibernate.internal.CriteriaImpl cannot be cast to org.com.utilities.classes.FullCriteria
at javaapplication8.JavaApplication8.main(JavaApplication8.java:12)
也许这是不可能的事情,我不知道,请大家指导我。
我的错误实现。
public class FullCriteria extends org.hibernate.internal.CriteriaImpl
{}
最佳答案
Session.createCriteria()
永远不会返回您自己的条件实现的实例。正如您所看到的,将结果强制转换为您的类不会有帮助,因为强制转换永远不会改变对象的类型。
假设您有对动物的引用。而且您知道这种动物是一匹马。然后你可以这样做:
Horse horse = (Horse) animal;
以便能够调用 Horse 中存在但 Animal 中不存在的方法。如果该动物实际上是牛,您将得到 ClassCastException,因为牛不是马。
您在应该使用组合的地方使用了继承。您的类不应扩展 CriteriaImpl。它应该使用或委托(delegate) Criteria 实例。
关于java - org.hibernate.Criteria 一堆扩展 org.hibernate.internal.CriteriaImpl 的 add(Restrictions),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14680398/