-
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-esventqueue-0](UserGroupManagerApp.java127) - [ljava.lang.object;@14B9B80
致命[awt-esventqueue-0](login.java78)-java.lang.classcastException:[ljava.lang.object;不能施放到UserGroupManager.model.db.person Java.lang.classcastException:[ljava.lang.object;不能施放到UserGroupManager.model.db.person
请帮助,现在我列出了所有40+ atter,它会占用查询时间,但我不喜欢它。我也正在寻找一种替代解决方案,可以帮助我解决这个问题。我读了 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所需的所有数据。因此,冬眠不能创建对象。
因此,投影的查询只会返回从查询IE返回的SQL的数组,即返回为列表,您可以将字段访问该数组中的普通条目。