【发布时间】:2021-11-09 16:08:20
【问题描述】:
我有两个表:收入和支出,其中存储了我所有的收入和支出交易,目前这两个表之间没有关系。
@Entity
@Table(name = "expense")
public class Expense {
private BigDecimal amount;
private LocalDate dueDate;
private LocalDate datePaid;
private String description;
......
}
@Entity
@Table(name = "income")
public class Income {
private BigDecimal amount;
private LocalDate dueDate;
private LocalDate datePaid;
private String description;
......
}
目前我使用 Spring Data JPA 的规范功能在单个实体上执行此操作:
费用:
Page<Expense> expensePage = expenseRepository.findAll(expenseSpecification, paginatedList);
对于收入:
Page<Income> depositPage = incomeRepository.findAll(incomeSpecification, paginatedList);
现在,我想在一张表上显示我的所有交易(收入和支出)。因此,我现在正在探索性能有效的解决方案,以便在应用过滤器和分页后从这两个表中获取数据。
我想使用规格,因为过滤器(金额、日期等...)是可选的。
我可以想到以下几种方法:
- 如上所述单独运行查询,合并结果,然后手动应用分页 - 从性能角度来看,这似乎非常无效,因为它将获取整个表数据
- 将本机 SQL 查询与 UNION 结合使用,但无法应用过滤器,因为过滤器是动态且可选的
选择 * 来自 ( 选择 ID, 数量, paid_on 为 "date_paid", “费用”作为“类型” 从 公共费用 联盟 选择 ID, 数量, received_on 作为“date_paid”, '订金' 从 公共存款 ) 作为 annon_1 在哪里 annon_1.amount > 2 和 annon_1.date_paid = '2021-08-10' 订购 annon_1.id 限制 5 偏移量 0
- 实现继承,因为收入和费用基本上都是事务,具有一些共享属性,如日期、金额、描述等……但这将是一个很大的变化,因为这两个表中已经有很多数据。所以我必须更改数据库架构、域类和迁移来管理现有数据
或者是否有其他性能有效的解决方案?
【问题讨论】:
-
如果您只是读取数据,您还可以创建映射到相同表并使用继承的“只读”实体。
-
@Thomas 是的,我只是在读取数据。你是说@MappedSuperclass继承策略?
-
MappedSuperclass实际上并不是一种继承策略,至少不是我定义它的方式。它提供共享属性,但实体不相关,您无法进行组合查询。假设您需要 2 个不同的表InheritanceType.TABLE_PER_CLASS。 -
@Thomas InheritanceType.TABLE_PER_CLASS 的问题是我们不能再使用身份密钥生成。
-
@Thomas 这将需要大量的架构更改,因为父实体也将映射到某个表。它实际上是我在问题中提到的第三个策略,对吧?
标签: java spring-boot hibernate spring-data-jpa spring-data