4

質問のタイトルが示すように、いくつかのテーブル属性のみを照会する射影基準を作成しようとしています。

したがって、Person テーブル/クラスがあり、約 40 の属性があります。基準で属性の動的な数を取得する必要があります。たとえば、10、11、または 12 (SQL 用語select firstname, lastname from person) とします。次のように実行していました。

Transaction tx = session.beginTransaction();
Criteria crit = session.createCriteria(Person.class);
crit.setCacheable(true);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("id"));
Criterias c = null;
 for (int i = 0; i < checked.size(); i++) {
        Attribute attr = checked.elementAt(i);
        switch (attr) {
            case LASTNAME:
                projList.add(Projections.property("lastName"));
                c = enumMap.get(attr);
                if (c.isChanged()) {
                    String tmp = (String) c.getAnswer();
                    tmp = tmp.replace('*', '%');
                    crit.add(Restrictions.like("lastName", tmp));
                    crit.addOrder(Order.asc("lastName"));
                }
            case ...THE REST .....
            }
    crit.setProjection(projList);
    retList = crit.list();
    tx.commit();
    return retList;

retListそして、要素が からのものではないことを返しますPerson.class:

INFO [AWT-EventQueue-0] (UserGroupManagerApp.java127) - [Ljava.lang.Object;@14b9b80
FATAL [AWT-EventQueue-0] (Login.java78) - java.lang.ClassCastException: [Ljava.lang.Object; usergroupmanager.model.db.Person にキャストできません java.lang.ClassCastException: [Ljava.lang.Object; usergroupmanager.model.db.Person にキャストできません

助けてください。今のところ、40 以上の属性をすべてリストしていますが、クエリに時間がかかり、気に入りません。これを解決するのに役立つ代替ソリューションも探しています。私は読んだことResultTransformerがありますが、私の場合はそれを使用する方法が見つかりませんでした。

4

3 に答える 3

6

あなたはcriteria.setResultTransformer()を使うことができます

Hibernateにはいくつかのトランスフォーマーが用意されています。あなたの人が関連付けを持っていない場合は、これを使用してください:

criteria.setResultTransformer(Transformers.aliasToBean(Person.class));

ただし、Personに関連付けがある場合は、http://github.com/moesio/seimosでSeimosを使用することを検討してください。

代わりにCriteriaを使用すると、多くのコードを保存できます。

于 2012-08-08T05:08:51.187 に答える
4

[Ljava.lang.Object; usergroupmanager.model.db.Person にキャストできません

にキャストObject[]することはできませんPerson。プロジェクションを実行すると、水和エンティティではなく、オブジェクトの配列として選択した属性が取得されます。

コードに の宣言がありませんretlist。どこかListにキャストした生だと思います。List<Person>それを に置き換えるだけList<Object[]>です。

于 2010-09-11T15:09:05.727 に答える
0

Hibernateでプロジェクションを使用する場合、Hibernateがオブジェクトを作成するために必要なすべてのデータをクエリしているわけではありません。したがって、Hibernateはオブジェクトを作成できません。

したがって、プロジェクションからのクエリは、クエリから返されたSQLの配列を返すだけです。つまり、リストとして返され、その配列のプレーンエントリとしてフィールドにアクセスします。

于 2010-09-11T15:46:14.740 に答える