简体   繁体   English

休眠条件+投影列表中的计算

[英]Hibernate criteria + calculation in Projection List

Invoice 发票

id description rate amount id 描述 金额
1 Invoice A 3.0 10.0 1张 发票A 3.0 10.0
2 Invoice B 4.0 20.0 2张 发票B 4.0 20.0
3 Invoice C 5.0 30.0 3 发票C 5.0 30.0

DetachedCriteria criteria= DetachedCriteria.forClass(Invoice.class)

ProjectionList projList = new ProjectionList(); 
projList.add(...);

criteria.setProjection(projList);

List list = myDAO.findByCriteria(criteria); 

//260

Using projection list, is it possible to calculate (amount * rate) and return the sum for all records? 使用投影列表,是否可以计算(金额*费率)并返回所有记录的总和?

Update 1: 更新1:

   double dblAmount = 0.0;
   for(Invoice invoice : list){
     dblAmount = dblAmount + (invoice.getRate() * invoice.getAmount());
   }

Using Hibernate 4, I heard that without specifying joins, using this way (invoice.getSomething()) has performance impact? 使用Hibernate 4,我听说没有指定连接,使用这种方式(invoice.getSomething())是否会对性能产生影响?

You can create a @Formula derived property and then create a projection on that: 您可以创建一个@Formula派生的属性,然后在该属性上创建一个投影:

Derived property: 派生属性:

@Entity
@Table(name="INVOICE")
public class Invoice {
    private double rate;
    private double amount;
    @Formula("rate * amount")
    private double computed;
    // ...
}

Projection: 投影:

Projections.sum("computed")
double sum=0;   
ProjectionList projList = new ProjectionList(); 
projList.add(Projections.property("rate"));
projList.add(Projections.property("amount"));
criteria.setProjection(projList);
List list=criteria.list();

for (Iterator it = list.iterator(); it.hasNext();) {
   double d=1;
   Object[] row = (Object[]) it.next(); 
   for (int i = 0; i < row.length; i++) { 
     d=d*Double.parseDouble(row[i].toString());
   } 
   sum=sum+d;
  }
return sum;

try this. 尝试这个。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM