基于sum的Hibernate属性

时间:2009-07-08 03:52:02

标签: hibernate jpa hql

我已经发现我可以使用hibernate来获取使用HQL的多个实体的总和,如下所示......

public Long getEnvelopeTotal(AbstractEnvelope envelope) {
    String query = "select sum(t.amount) from User_Transaction t";
    Long result = (Long) hibernateUtil.getSession().createQuery(query).uniqueResult();
    return result;
}

目前我的应用程序的其余部分只能通过对象图无缝地导航数据库。必须使用上述函数的问题是我必须执行以下伪代码...

  1. 获取实体“Envelope”的实例
  2. 传递信封实例i
  3. 根据getEnvelopeTotal的结果,将Envelope实例属性“total”设置为结果。
  4. 我想知道是否可以通过自定义HQL查询设置属性“total”而不是映射到简单的数据库列来使用hibernate。

    前:

    @SomeMagicAnnotation(query="select sum(t.amount) from User_Transaction t")
    private Long total;
    

    有什么建议吗?

2 个答案:

答案 0 :(得分:10)

啊哈,我在阅读this blog post之后想出来了。

现在代码如下:

@Entity(name = "Abstract_Envelope")
public abstract class AbstractEnvelope extends AbstractAccount {

    @OneToMany(mappedBy = "abstractEnvelope")
    private List<UserTransaction> userTransactions;
    @Formula(value = "select sum(t.amount) from User_Transaction t where t.abstractenvelope_id = id")
    private Long total;

    public List<UserTransaction> getUserTransactions() {
        return userTransactions;
    }

    public void setUserTransactions(List<UserTransaction> userTransactions) {
        this.userTransactions = userTransactions;
    }

    public Long getTotal() {
        return total;
    }

    public void setTotal(Long total) {
        this.total = total;
    }
}

请注意,您必须注释字段而不是方法(我必须这样做),而且在编写这些查询时,您指的是实际的DB列名称而不是bean属性名称。另外通过引用id而不是something.id,你指的是this.id或this.price有效。

答案 1 :(得分:1)