1

こんにちはみんな org.hibernate.Criteria のようなもののラッパーとして機能する単一の Java クラスを開発して、一連の 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()独自の基準実装のインスタンスを返すことはありません。そして、これまで見てきたように、結果をクラスにキャストしても、オブジェクトのタイプが変更されることはないため、役に立ちません。

動物への参照があるとします。そして、あなたはこの動物馬であることを知っています。その後、それを行うことができます:

Horse horse = (Horse) animal;

馬に存在し、動物には存在しないメソッドを呼び出すことができるようにするため。動物が実際に牛である場合、牛は馬ではないため、ClassCastExceptionが発生します。

コンポジションを使用する必要がある場所で継承を使用しています。クラスはCriteriaImplを拡張しないでください。Criteriaインスタンスを使用するか、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 に答える