1

嗨,伙计们,我正在尝试开发一个 Single Java 类,它可以作为 org.hibernate.Criteria 之类的包装器,以一种优雅的方式摆脱一堆 add(Restrictions) 。到目前为止,我得到的是一个遗留系统。

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
{}
4

2 回答 2

1

Session.createCriteria()永远不会返回您自己的标准实现的实例。正如您所见,将结果转换为您的类也无济于事,因为转换永远不会改变对象的类型。

假设你有一个 Animal 的引用。你知道这种动物一匹马。然后你可以这样做:

Horse horse = (Horse) animal;

为了能够调用存在于 Horse 中而不存在于 Animal 中的方法。如果该动物实际上是一头牛,您将收到 ClassCastException,因为牛不是马。

您在应该使用组合的地方使用继承。您的类不应扩展 CriteriaImpl。它应该使用委托给Criteria 实例。

于 2013-02-04T07:21:46.350 回答
0

不要将强制Criteria转换对象键入您自己的实现类的实例,它会引发错误java.lang.ClassCastException: org.hibernate.internal.CriteriaImpl cannot be cast to com.uk.mysqlmaven.domain.CommonLookUpMaster

您可以使用以下示例得到上述错误

例子:

Session session = SessionFactoryMySqlMaven.getCurrentSession();
Criteria criteria = session.createCriteria(CommonLookUpMaster.class);
CommonLookUpMaster master = (CommonLookUpMaster) criteria.add(Restrictions.eq("type", type));

使用类中的uniqueResult()方法,criteria我们可以根据限制获取单个记录。如果您想获取single记录,请使用以下示例

示例 1:

Session session = SessionFactoryMySqlMaven.getCurrentSession();
Criteria criteria = session.createCriteria(CommonLookUpMaster.class);
criteria = criteria.add(Restrictions.eq("type", type));
CommonLookUpMaster master = (CommonLookUpMaster) criteria.uniqueResult();

为了得到multiple records as a list使用下面的例子

示例 2:

Session session = SessionFactoryMySqlMaven.getCurrentSession();
Criteria criteria = session.createCriteria(CommonLookUpMaster.class);
criteria = criteria.add(Restrictions.eq("type", type));
List<?> list = criteria.list();
于 2014-06-02T06:01:22.260 回答