-
02-10-2019 - |
質問
質問のタイトルと同様に、私はテーブル属性のいくつかのみをクエリする投影基準を作成しようとしています。
だから私は人のテーブル/クラスを持っていて、それには約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
:
情報[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
しかし、私の場合、それを使用する方法を見つけていません。
解決
ljava.lang.object; usergroupmanager.model.db.personにキャストすることはできません
きれいな言葉で言う Object[]
に投げかけることはできません Person
. 。投影を行うと、水分補給エンティティの代わりにオブジェクトの配列として選択した属性が取得されます。
コードには宣言がありません retlist
. 。私はそれが生だと思います List
あなたがキャストします List<Person>
どこか。それを置き換えるだけです List<Object[]>
.
他のヒント
criteria.setresulttransformer()を使用できます
冬眠にはいくつかの変圧器が用意されています。あなたの人が協会を持っていない場合、これを使用してください:
criteria.setResultTransformer(Transformers.aliasToBean(Person.class));
しかし、人が何らかの関連性を持っている場合は、でseimosを使用することを検討してください http://github.com/moesio/seimos
代わりに基準を使用すると、多くのコードを保存できます。
Hibernateで投影を使用する場合、オブジェクトを作成するためにHibernateが必要とするすべてのデータをクエリしていません。したがって、冬眠はオブジェクトを作成できません。
したがって、プロジェクションからのクエリは、クエリから返されるSQLの配列を返すだけで、リストとして返され、その配列のプレーンエントリとしてフィールドにアクセスします。