【问题标题】:Spring Data Hibernate JPQL Aggregate QuerySpring Data Hibernate JPQL 聚合查询
【发布时间】:2014-03-05 09:32:51
【问题描述】:

我有一个带有实体的 Spring Data 实现

@Entity
public class Account extends AbstractEntity {

...

    @OneToMany(mappedBy = "account")
    private Set<AccountTransaction> accountTransactions;

还有AccountTransactions

@Entity(name="AccountTransactions")
public class AccountTransaction extends AbstractEntity {

    /**
     * 
     */
    private static final long serialVersionUID = -7045838402463741959L;

    @ManyToOne(optional = false)
    @JsonIgnore
    private Account account;

    @Column
    @Enumerated(EnumType.ORDINAL)
    private TransactionType transactionType;

    @Column
    private BigDecimal amount;

还有我正在尝试执行聚合查询的存储库:sum(amount)

然而结果是null

public interface AccountTransactionRepository extends
        CrudRepository<AccountTransaction, Long> {

    // @Query(value =
    // "select sum(amount) from AccountTransaction where account.id = ?1")
    @Query(value = "SELECT sum(at.amount) FROM AccountTransactions at WHERE at.account.id = :accountId")
    public BigDecimal getAccountBalance(@Param("accountId") Long accountId);
}

我需要做什么才能得到amount 列的BigDecimal 总和?

*更新*

我能够让查询工作,将其更改为 nativeQuery,如下所示:

@Query(value = "SELECT sum(amount) FROM account_transaction WHERE account_id = :accountId", nativeQuery = true)
    public BigDecimal getAccountBalance(@Param("accountId") Long accountId);

这显然不太理想……因为我不想为每个查询都写这个……

【问题讨论】:

  • 我没有看到任何JoinColumn 注释来定义AccountAccountTransaction 之间的关系,您的数据库列是否使用了适当的默认值?
  • 我认为 @OneToMany(mappedBy = "account")@ManyToOne(optional = false) 选项负责建立关联......到目前为止,其他所有内容都正常加载......
  • AccountTransaction 中的外键名称是什么?这取决于名称是否使用适当的默认值
  • @KevinBowersox 在数据库中创建后应该是account_id,在@Entity注解类中只是Account...

标签: hibernate spring-data


【解决方案1】:

您必须添加JoinColumn 才能建立关系:

@ManyToOne(optional = false)
@JoinColumn(name="FOREIGN_KEY_HERE")
@JsonIgnore
private Account account;

【讨论】:

  • 所以在hbm2ddl 语句中我看到Hibernate: alter table account_transactions add constraint FK_lpcrni2dw78hajvb0gfd5xcr foreign key (account_transactions) references account 这是一个随机生成的FK 约束。我根据为 AccountTransaction 实体设置的命名约定添加了 @JoinColumn(name="AccountTransactions") - 但它仍然返回 null。
  • 还想知道使用improved naming strategy(我开始使用Spring Boot 时默认)对此有何影响? account_id 是在 AccountTransaction 上创建的列,mappedBy 默认看到:stackoverflow.com/questions/3818797/…(关于 JoinColumn,声明它已经有一个?)
  • 将连接列命名为 ACCOUNT_ID
  • 感谢@KevinBowersox 的工作......大写!
  • @jordan.baucke 很高兴我能帮上忙!
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 2016-09-25
  • 2017-05-02
  • 2015-12-17
  • 2019-10-27
  • 1970-01-01
  • 2020-06-05
相关资源
最近更新 更多