Hibernate预测列表

Har*_*rry 5 hibernate criteria projection

我只能从表中获得几个列值.所以我使用Projections来实现这一目标.代码有效,但我认为它没有效果.

我的问题是当我使用ProjectionsList然后将criteria.list设置为ArrayList时 - Bulletin对象为null.我不确定如何更好地解释这一点.所以我会把代码放进去,请阅读下面的内容:

 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;
Run Code Online (Sandbox Code Playgroud)

我只需要将criteria.list设置为BulletinList(包含Bulletin对象列表的类).但是当我使用投影时,Bulletin对象为null.

我也在阅读另一个使用的线程

setResultTransformer(Transformers.aliasToBean
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.所以有人可以帮助解决如何使代码更好的问题.

谢谢

哈里什

Shi*_*wal 8

您可以使用

 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();
Run Code Online (Sandbox Code Playgroud)

这里的criteria.setResultTransformer(新的AliasToBeanResultTransformer(Bulletin.class))将在所需的POJO类中转换您的结果,但要确保您的POJO类(在您的情况下为Bulletin.class)应该具有适当的setter来设置属性的值.

现在,criteria.list()将返回Bulletin POJO类的List而不是Object.


car*_*tax 5

  1. Projections.property()接受一个字符串作为参数。在您提供的代码中,该字符串的值应该是 Bulletin 类成员的名称。bulletinIdAttr例如,大概是一个具有这样值的字符串,否则您将收到运行时错误。
  2. 当您调用setProjectionCriteria 实例时,您隐式地将 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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

但这不会对您的结果产生任何影响。你检查过它rows是空的吗?