Hibernate 休眠投影列表

Hibernate 休眠投影列表,hibernate,criteria,projection,Hibernate,Criteria,Projection,我只需要从表中获取一些列值。所以我用预测来实现这一点。代码是有效的,但我不认为它是有效的 我的问题是使用ProjectionList&然后将criteria.list设置为ArrayList-Bulletin对象为空。我不知道如何更好地解释这一点。因此,我将输入代码,然后请阅读以下内容: List<Bulletin> list = new ArrayList<Bulletin>(); BulletinList bulletinList = null; Criter

我只需要从表中获取一些列值。所以我用预测来实现这一点。代码是有效的,但我不认为它是有效的

我的问题是使用ProjectionList&然后将criteria.list设置为ArrayList-Bulletin对象为空。我不知道如何更好地解释这一点。因此,我将输入代码,然后请阅读以下内容:

 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
    可能是一个具有这样一个值的字符串,否则会出现运行时错误
  • 当您在Criteria实例上调用
    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();