【问题标题】:improving hibernate query performance提高休眠查询性能
【发布时间】:2019-07-28 19:34:23
【问题描述】:

我正在尝试提高查询性能,但没有找到方法。我有休眠实体两个派生属性和一对多关系,它们正在查询同一个表(凭证),这将生成 2 个子查询和一个连接查询,有没有办法将这两个子查询和连接查询结合起来(对于一对多关系)在一个查询中

我检查了@Formula 可以用于多对一关系,但不能用于一对多

这是实体的一部分:

@Entity
@Immutable
@Table(name = pool_table)
public class PoolView{

@Formula(value = "(select sum(sum) from Voucher")
  private Double totalSum = 0.0;

  @Formula(value = "(select sum(rank) from Voucher")
  private Double totalRank = 0.0;

  @OneToMany(fetch = FetchType.LAZY)
  @JoinColumn(name = v.id, insertable = false, updatable = false)
  @BatchSize(size = 50)
  @JsonProperty("voucher_filters")
  private List<VoucherFilters> vouchersFilters;
}

【问题讨论】:

  • 首先你有 Lazy fetch 类型,这意味着你只有在使用它时才会得到你的列表。公式也可能很懒stackoverflow.com/questions/10070440/…如果你不是总是需要它们,它会减少获取实体的时间。您能否提供有关何时使用实体字段的更多信息?您如何描述自己的表现?

标签: java sql hibernate


【解决方案1】:

在一个查询中使用它的唯一方法是将两个字段 totalSum 和 totalRank 移动到实体 VoucherFilters。

假设表 Voucher 中的外键列称为 pool_tableId 那么您可以像这样使用公式

@Formula(value = "(select sum(sum) from Voucher where pool_tableId = pool_table.id") 私人双总和 = 0.0;

@Formula(value = "(select sum(rank) from Voucher pool_tableId = pool_table.id") 私有 Double totalRank = 0.0;

另一个问题是 PoolView 类中的 JoinColumn 注释应该引用表 Voucher 中的外键列,例如pool_tableId

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2021-08-03
    相关资源
    最近更新 更多