Hibernate 休眠投影列表
我只需要从表中获取一些列值。所以我用预测来实现这一点。代码是有效的,但我不认为它是有效的 我的问题是使用ProjectionList&然后将criteria.list设置为ArrayList-Bulletin对象为空。我不知道如何更好地解释这一点。因此,我将输入代码,然后请阅读以下内容:Hibernate 休眠投影列表,hibernate,criteria,projection,Hibernate,Criteria,Projection,我只需要从表中获取一些列值。所以我用预测来实现这一点。代码是有效的,但我不认为它是有效的 我的问题是使用ProjectionList&然后将criteria.list设置为ArrayList-Bulletin对象为空。我不知道如何更好地解释这一点。因此,我将输入代码,然后请阅读以下内容: List<Bulletin> list = new ArrayList<Bulletin>(); BulletinList bulletinList = null; Criter
List<Bulletin> list = new ArrayList<Bulletin>();
BulletinList bulletinList = null;
Criteria criteria = null;
criteria = this.getSession().createCriteria(Bulletin.class)
.setProjection(Projections.projectionList()
.add(Projections.property(bulletinIdAttr))
.add(Projections.property(docNameAttr))
.add(Projections.property(docTypeCodeAttr))
);
criteria.addOrder(Order.desc(createdTimeAttr));
List<Object> rows = criteria.list();
for (Object r : rows) {
Object[] row = (Object[]) r;
Bulletin bull = new Bulletin();
bull.setBulletinId((Long) row[0]);
bull.setDocumentName((String) row[1]);
bull.setDocumentTypeCode((String) row[2]);
list.add(bull);
}
bulletinList = new BulletinList();
bulletinList.setBulletins(list);
return bulletinList;
但那也不行。那么,有人能在这方面帮助我们改进代码吗
谢谢
哈里什
Projections.property()
将字符串作为参数。在您提供的代码中,该字符串的值应为Bulletin类成员的名称。例如,bulletiniattr
可能是一个具有这样一个值的字符串,否则会出现运行时错误setProjection
时,您正在隐式地将ResultTransformer设置为PROJECTIONS
,这就是您想要的。无需自己调用setResultTransformer
。我会把日常工作简化一点,就像这样
List<Object[]> rows = criteria.list();
for (Object[] row : rows) {
Bulletin bull = new Bulletin();
bull.setBulletinId((Long) row[0]);
bull.setDocumentName((String) row[1]);
bull.setDocumentTypeCode((String) row[2]);
list.add(bull);
}
List rows=criteria.List();
对于(对象[]行:行){
公告布尔=新公告();
bull.setBulletinId((长)行[0]);
bull.setDocumentName((字符串)行[1]);
bull.setDocumentTypeCode((字符串)行[2]);
列表。添加(bull);
}
行
是否为空?您可以使用
criteria = this.getSession().createCriteria(Bulletin.class)
.setProjection(Projections.projectionList()
.add(Projections.property(bulletinIdAttr),"bulletinIdAttr")
.add(Projections.property(docNameAttr),"docNameAttr")
.add(Projections.property(docTypeCodeAttr),"docTypeCodeAttr")
);
criteria.addOrder(Order.desc(createdTimeAttr));
criteria.setResultTransformer(new AliasToBeanResultTransformer(Bulletin.class));
List<Bulletin> bulletinList = criteria.list();
criteria=this.getSession().createCriteria(bullent.class)
.setProjection(Projections.projectionList()项目)
.add(Projections.property(bulletinIdAttr),“bulletinIdAttr”)
.add(Projections.property(docNameAttr),“docNameAttr”)
.add(Projections.property(docTypeCodeAttr),“docTypeCodeAttr”)
);
criteria.addOrder(Order.desc(createdTimeAttr));
setResultTransformer(新别名为BeanResultTransformer(Bulletin.class));
列表bulletinList=条件。列表();
此处criteria.setResultTransformer(新别名BeanResultTransformer(Bulletin.class))将在所需的POJO类中转换结果,但请确保您的POJO类(在您的情况下为Bulletin.class)应有适当的设置器来设置属性值
现在criteria.list()将返回Bulletin POJO类的列表,而不是对象。如果要从相同的条件执行第二次搜索,必须更改或删除投影。例如,如果首先搜索计数:
criteria.setProjection(Projections.rowCount());
Integer count = criteria.list().get(0);
然后要获取所有对象:
criteria.setProjection(null);
List<Object> returnedObjects = criteria.list();
criteria.setProjection(null);
List returnedObjects=criteria.List();
非常感谢您的回复。正如我所说,我上面的代码工作正常,但我只是想知道它是否有效。是的,Projections.property()将字符串作为参数。当我尝试使用您的代码块时,出现以下错误:类型不匹配:无法在(对象[]行:行)的第行上从元素类型Object转换为对象[]。我错过了什么?请让我知道。对不起,Harish,我的原始答案格式不正确,这使得行声明错误。它应该像现在这样工作。这个很好用。多谢。但是你能告诉我使用列表和列表的区别吗?为什么这样更好。一旦编译好了,可能不会有太大的区别。但是,当您将结果集强制转换一次而不是两次时,代码更清晰。(一次作为对象,然后每行一次作为对象[])。不再在该项目上。但非常感谢您的努力,尽管这是一个旧线程。这个问题困扰了我很多天,我无法使用Projections.projectionList()获取所有属性详细信息,但现在我用这种方式执行我的项目,真的感谢@Shiva Agrawal先生
criteria.setProjection(null);
List<Object> returnedObjects = criteria.list();