当前位置: 首页 > 知识库问答 >
问题:

带有两个表的Spring Data JPA规范分页

岳正阳
2023-03-14

我有两个表:收入和支出,我在其中存储所有收入和支出交易,目前这两个表之间没有关系。

@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的规范功能在单个实体上执行此操作:

费用:页面

收入:<代码>第页

现在,我想在一个表上显示我所有的交易(收入和费用)。所以我现在正在探索性能有效的解决方案,以在应用过滤器和分页后从这两个表中获取数据。

我想使用规格,因为过滤器(数量、日期等...)是可选的。

我可以想到以下方法:

  1. 如上所述单独运行查询,合并结果,然后手动应用分页-从性能角度来看,这似乎效率很低,因为它将获取整个表数据

选择*from(SELECT id,金额,paid_on为"date_paid",'EXPENSE'为"type"frompublic.expenseUNION SELECT id,金额,received_on为"date_paid",'DEPOSIT'Frompublic.deposit)annon_1annon_1.amount

或者是否有其他有效的性能解决方案?


共有1个答案

段干瑞
2023-03-14

您还有另一个选项,即使用子选择实体。

@Entity
@Subselect("select i.id as id, true as income, i.description as description, i.date_paid as date_paid, i.due_date as due_date, i.amount as amount from income i union all select e.id as id, false as income, e.description as description, e.date_paid as date_paid, e.due_date as due_date, e.amount as amount from expense e")
public class Transaction {
    @EmbeddedId
    private TransactionId id;
    @Column(name = "amount")
    private BigDecimal amount;
    @Column(name = "due_date")
    private LocalDate dueDate;
    @Column(name = "date_paid")
    private LocalDate datePaid;
    @Column(name = "description")
    private String description;
}

@Embeddable
public class TransactionId {
    @Column(name = "id", nullable = false)
    private Long id;
    @Column(name = "income", nullable = false)
    private boolean income;
}

然后,您可以像查询收入和支出一样进行查询。

除此之外,我可以建议您为此使用Blaze持久性,该持久性在JPA/Hibernate之上工作,并添加对集合操作(如UNION ALL)的支持,以防您需要更动态地创建此UNION,即根据某些运行时条件更改查询。我还认为这是Blaze持久性实体视图的完美用例。

我创建了这个库,以便在JPA模型和自定义接口或抽象类定义的模型之间进行简单的映射,比如Spring数据在类固醇上的投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型。

使用Blaze持久性实体视图时,用例的DTO模型可能如下所示:

@EntityView(Transaction.class)
public interface TransactionDto {
    @IdMapping
    TransactionIdDto getId();
    String getDescription();
    LocalDate getDatePaid();
    LocalDate getDueDate();
    BigDecimal getAmount();

    @EntityView(TransactionId.class)
    interface TransactionIdDto {
        @IdMapping
        Long getId();
        boolean isIncome();
    }
}

查询是将实体视图应用于查询的问题,最简单的就是按id进行查询。

TransactionDto a=entityViewManager.find(entityManager, TransactionDto.class, id);

Spring数据集成允许您像Spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-数据功能

Page<TransactionDto> findAll(Pageable pageable);

最好的部分是,它只会获取实际需要的状态!

 类似资料:
  • 我想使用JOLT将下面的输入json转换为输出json。这里的主要问题是在列表中,我必须删除一些根键(Param1、Param2、…)会动态不同的字段。我尝试了以下规范,但没有成功。在这种情况下需要帮助。

  • 如何使用规范编写下面查询 当我们使用Specification时,即使在multiselect中提到了count(),也没有选择count()。 为什么JPA中的multiselect方法不起作用

  • 我在我的项目中包含了2个BC JAR:bcpkix-jdk15on-1.47.jar和bcprov-jdk15on-157.jar。 作为代码中的第一行,我添加了: 行发生异常: 有没有什么方法可以让我定期包括这两个BouncyCastle罐子?

  • 我正在为一个新endpoint创建一个招摇规范,该endpoint将接收一个作为二进制数据的文件。你会如何在夸张的规范中表达这一点?我将对象视为数据类型,但这似乎不是我要寻找的。过去有人这样做过吗? 据我所知,这个问题不是重复的,因为它专门涉及二进制或“blob”对象类型。

  • 我正在尝试开发一个具有规范和RSQL的搜索API。遵循本教程-https://www.baeldung.com/rest-api-search-language-rsql-fiql