我很想找到一个解决这个问题的方法,但到目前为止还没有找到任何相关和有用的方法。
我有一个表Transaction
:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "transaction_id")
private Long id;
@Column(name = "user_id", nullable = false)
private Long userId;
@Column(name = "wallet_name", nullable = false)
private String walletName;
@NotNull(message = "Please, insert a amount")
@Min(value = 0, message = "Please, insert a positive amount")
private Double amount;
private String note;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Column(name = "date")
private LocalDate date;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "wallet_id", nullable = false)
private Wallet wallet;
@Enumerated(EnumType.STRING)
@Column(name = "transaction_type", columnDefinition = "ENUM('EXPENSE', 'INCOME')")
private TransactionType transactionType;
@Nullable
@Enumerated(EnumType.STRING)
@Column(name = "expense_categories", columnDefinition = "ENUM('FOOD_AND_DRINK', 'SHOPPING', 'TRANSPORT', 'HOME'," +
" 'BILLS_AND_FEES', 'ENTERTAINMENT', 'CAR', 'TRAVEL', 'FAMILY_AND_PERSONAL', 'HEALTHCARE'," +
" 'EDUCATION', 'GROCERIES', 'GIFTS', 'BEAUTY', 'WORK', 'SPORTS_AND_HOBBIES', 'OTHER')")
private ExpenseCategories expenseCategories;
@Nullable
@Enumerated(EnumType.STRING)
@Column(name = "income_categories", columnDefinition = "ENUM('SALARY', 'BUSINESS', 'GIFTS', 'EXTRA_INCOME', 'LOAN', 'PARENTAL_LEAVE', 'INSURANCE_PAYOUT', 'OTHER')")
private IncomeCategories incomeCategories;
现在,为了在Thymeleaf上显示数据,我创建了一个控制器,并将模型传递给Thymeleaf。
它看起来像这样:
@GetMapping("/userTransactions/{user_id}")
public String getUserTransactions(@PathVariable("user_id") long user_id, Model model) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
UserDetailsImpl user = (UserDetailsImpl) authentication.getPrincipal();
long userId = user.getId();
model.addAttribute("userId", userId);
model.addAttribute("transactions", transactionService.findDistinctIdByUserId(user_id));
return "transactions";
}
您可以看到,Transaction
与User
相连,因此用户实际上可以创建Transaction
,并且在该控制器上,我只是从每个用户获取所有事务,这就是我如何在Thymeleaf
上显示它:
<div th:each="transactions : ${transactions}">
<h2>Amount: <span th:text="${transactions.amount}"></span></h2>
<br>
<h2>Note: <span th:text="${transactions.note}"></span></h2>
<br>
<h2>Date: <span th:text="${transactions.date}"></span></h2>
<br>
<h2>Wallet name: <span th:text="${transactions.walletName}"></span></h2>
<br>
<h2>Expense Category: <span th:text="${transactions.expenseCategories}"></span></h2>
<br>
<h2>IncomeCategory: <span th:text="${transactions.incomeCategories}"></span></h2>
</div>
不要介意我格式化的方式,重点是到目前为止,我得到了页面上显示的所有数据,但我想实现一件事:
可以看到,在创建事务的同时用户还选择了一个日期,而我想要什么呢?
假设用户今天有两个事务,我指的是18/01/2023
我想有一个标题,例如<div
,传递今天的日期和今天的每笔交易,下面的标题例如15/01/2023
,因为用户也有在那个日期的交易。
这是一个例子,正如你所看到的,我有今天部分,因为用户在今天做了一个交易,昨天也做了交易,然后回到1月14日,所以我想为每个这样的交易分开。示例
对不起SS,我试图添加代码片段,但无法在此更新的SO中找到选项。
我不知道从哪里开始,我发现了一些选项,比如从升序和降序排序日期,但我想避免这样的事情,并尽我最大的努力实现这一点。所以这里的任何资源,教程或任何帮助都会很好。谢谢。
如果您想按日期划分,您应该事先在Java中这样做。您不应该传递List<Transaction>
,而应该传递List<TransactionGroup>
,其中TransactionGroup包含一天的所有事务。它可能看起来像:
class TransactionGroup {
private LocalDate date;
private List<Transaction> transactions;
/* Getters and setters */
}
那么你的html就变得简单了。
<div th:each="group : ${transactionGroup}">
<h1 th:text="${group.date}" />
<div th:each="transaction : ${group.transactions}">
<h2>Amount: <span th:text="${transactions.amount}"></span></h2><br>
<h2>Note: <span th:text="${transactions.note}"></span></h2><br>
<h2>Wallet name: <span th:text="${transactions.walletName}"></span></h2><br>
<h2>Expense Category: <span th:text="${transactions.expenseCategories}"></span></h2><br>
<h2>IncomeCategory: <span th:text="${transactions.incomeCategories}"></span></h2>
<div>
</div>