java - 提高 Hibernate 查询性能

标签 java sql hibernate

我正在尝试提高查询性能,但没有找到方法。我有 hibernate 实体两个派生属性和一对多关系,它们正在查询同一个表(凭证),这将生成 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;
}

最佳答案

将其包含在一个查询中的唯一方法是将两个字段totalSum 和totalRank 移至实体VoucherFilters。

假设表 Voucher 中的外键列名为 pool_tableId 那么您可以像这样编写公式

@Formula(value = "(从优惠券中选择 sum(sum),其中 pool_tableId = pool_table.id") 私有(private) double 总和 = 0.0;

@Formula(value = "(从优惠券 pool_tableId = pool_table.id 中选择总和(排名)") 私有(private) double 总排名 = 0.0;

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

关于java - 提高 Hibernate 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57244333/

相关文章:

java - 对 javaFX 树 TableView 项目进行排序

java - 使用控制组管理 Java 进程

mysql - 如何在 MySQL 中将默认 Null 更改为 NOT NULL

sql - Oracle 中的命令 "REM INSERTING into TABLE_NAME"究竟做了什么?

测试中的 Hibernate OnDelete 级联不起作用

java - 在私有(private)方法中保存实体

java - 如何解决maven提供的范围问题

java - 为什么这个 @ComponentScan 在我的 spring boot 应用程序中不起作用?

php - 使用 mysql 只插入一次行(在一个查询中)

java - @Transactional 服务方法回滚 hibernate 更改