标准和预测

时间:2011-07-19 19:21:51

标签: java hibernate criteria

我有一个实体:订单明细。它看起来如下:

@ManyToOne
public Product getProduct() {
    return this.product;
}
public void setProduct(Product product) {
    this.product = product;
}

@Column(name="amount",nullable = false)
public int getAmount() {
    return this.amount;
}
public void setAmount(int amount) {
    this.amount= amount;
}

@Transient
public void setSum_amount(double sum_amount){
    this.sum_amount=sum_amount;
}

我正在尝试在订单明细表中获取订单详细信息,逐个产品以及每个产品的数量列表。

这是我的代码:

    session=sessionFactory.openSession();
    List<OrderDetail> od=session.createCriteria(OrderDetail.class) 
    .setProjection( Projections.projectionList()
            .add( Projections.sum("amount"),"sum_amount")
            .add( Projections.groupProperty("product"))
    )
    .setResultTransformer(Transformers.aliasToBean(OrderDetail.class))
    .list();

问题是我无法访问product属性,执行“od.getProduct()。getName()”我得到nullpointerexception,所以,我该如何修复它?

2 个答案:

答案 0 :(得分:0)

您并没有真正获得订单详细信息列表,而是获得每个订单明细组的总和列表。因此,您将从SQL获取数值。因此,我认为,您将获得空OrderDetail(因为变换器)对象的列表,其上只设置了sum_amount

您的问题无法以当前形式解决,因为您的查询未获得订单详细信息但完全不同的对象。你应该重新思考你想要实现的目标和方式。

答案 1 :(得分:0)

当您使用Projections对事物进行分组时,您将根据定义限制从查询中返回的内容。在上面的示例中,您只返回2列,因此未初始化@ManyToOne关联。获得结果集后,尝试循环它,对于每条记录,使用Hibernate.initialize加载关联。