我有两个表:收入和支出,我在其中存储所有收入和支出交易,目前这两个表之间没有关系。
@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的规范功能在单个实体上执行此操作:
费用:页面
收入:<代码>第页
现在,我想在一个表上显示我所有的交易(收入和费用)。所以我现在正在探索性能有效的解决方案,以在应用过滤器和分页后从这两个表中获取数据。
我想使用规格,因为过滤器(数量、日期等...)是可选的。
我可以想到以下方法:
如上所述单独运行查询,合并结果,然后手动应用分页-从性能角度来看,这似乎效率很低,因为它将获取整个表数据
选择*from(SELECT id,金额,paid_on为"date_paid",'EXPENSE'为"type"frompublic.expenseUNION SELECT id,金额,received_on为"date_paid",'DEPOSIT'Frompublic.deposit)annon_1annon_1.amount
或者是否有其他有效的性能解决方案?
您还有另一个选项,即使用子选择实体。
@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