【问题标题】:Hibernate property based on sum基于总和的休眠属性
【发布时间】:2009-07-08 03:52:02
【问题描述】:

我发现我可以使用 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. 获取实体“信封”的实例
  2. 传递信封实例 i
  3. 根据 getEnvelopeTotal 的结果,将 Envelope 实例属性“total”设置为结果。

我想知道是否可以通过自定义 HQL 查询设置属性“total”而不是映射到简单的数据库列的方式使用 hibernate。

例如:

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

有什么建议吗?

【问题讨论】:

    标签: hibernate jpa hql


    【解决方案1】:

    啊哈,看完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。

    【讨论】:

    • 我必须在整个 SELECT 语句周围加上括号才能让我的工作。 (从 User_Transaction t 中选择 sum(t.amount) ......)
    【解决方案2】:

    【讨论】:

    • 可能是这种情况,但我找不到足够的信息,我在 Hibernate 论坛上发布了相同的问题但没有收到任何回复(尚未)forum.hibernate.org/viewtopic.php?f=1&t=998165
    • 你得到了什么?一个例外,错误的结果..我猜你需要在 select 语句周围添加 ( )。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多