英文:
Map multiple rows to one object based on column value
问题
在我的系统中,我有一个user_transactions表,其中包含id、transaction_type、transaction_date、linked_transaction列。在每个班次开始时,系统会在数据库中创建一个名为START_SHIFT的交易记录,而在结束时会创建一个名为END_SHIFT的新交易记录,其中在linked_transaction列中会包含对应START_SHIFT交易记录的id。现在,我需要提取所有的START_SHIFT和END_SHIFT交易记录,并将它们映射到一个会话(session)对象,该对象具有以下字段:id、startDate、endDate。其中,id应为START_SHIFT交易记录的id,startDate为START_SHIFT交易记录的日期,而endDate为END_SHIFT交易记录的日期。
目前,我从数据库中获取这两种类型的交易记录作为交易列表,我为每个START_SHIFT交易记录创建一个对象,并将它们添加到列表中,但我不知道如何在这些对象中设置endDate。
List<ats.wallet.model.Transaction> transactions = walletDao.getTransactions(query, parameters, 0, 100, true);
List<TerminalSession> userSessions = new ArrayList<>();
transactions.stream().filter(t -> t.getType().equals(TransactionType.START_SHIFT)).forEach(t -> {
UserSession userSession = new UserSession();
userSession.setId(Long.getLong(t.getId()));
userSession.setStartDate(t.getTransactionDate());
userSessions.add(userSession);
});
英文:
In my system I have user_transactions table, it contains id, transaction_type, transaction_date, linked_transaction
columns. At the beginning of a shift, the system creates transaction START_SHIFT in db, and at the end a new transaction called END_SHIFT with START_SHIFT transaction id in the linked_transaciton column. Right now I need to take out all start_shift and end_shift transactions and map them to session object with fields: id, startDate, endDate
id should be start_shift transaction id, startDate is START_SHIFT transaction date and endDate is END_SHIFT transaction date.
For now, I take these two types of transactions from db as a list of transactions, I create an object for every START_SHIFT transaction and I add them to the list but I don't know how to set endDate in these objects
List<TerminalSession> userSessions = new ArrayList<>();
transactions.stream().filter(t -> t.getType().equals(TransactionType.START_SHIFT)).forEach(t -> {
UserSession userSession = new UserSession();
userSession.setId(Long.getLong(t.getId()));
userSession.setStartDate(t.getTransactionDate());
userSessions.add(userSession);
}); ```
</details>
# 答案1
**得分**: 1
因为是END_SHIFT交易与其对应的START_SHIFT交易相连接,所以您可以从它们开始创建会话对象。
要从END_SHIFT链接的交易ID中检索START_SHIFT交易,您可以准备一个以ID为键的映射:
```java
Map<Long, Transaction> map = transactions.stream()
.collect(Collectors.toMap(Transaction::getId, Function.identity()));
transactions.stream()
// 使用END_SHIFT而不是START_SHIFT
.filter(t -> t.getType().equals(TransactionType.END_SHIFT))
.forEach(t -> {
UserSession userSession = new UserSession();
// 从映射中获取链接的START_SHIFT的ID和开始日期
Transaction startShift = map.get(t.getLinkedTransaction());
userSession.setId(startShift.getId());
userSession.setStartDate(startShift.getTransactionDate());
userSession.setEndDate(t.getTransactionDate());
userSessions.add(userSession);
});
英文:
Since it's the END_SHIFT transaction that has the link to its corresponding START_SHIFT transaction, you probably could start from them to create the session objects.
To retrieve the START_SHIFT transaction from the END_SHIFT linked transaction id you could prepare a map with the id as the key:
Map<Long, Transaction> map = transactions.stream()
.collect(Collectors.toMap(Transaction::getId, Function.identity()));
transactions.stream()
// END_SHIFT instead of START_SHIFT
.filter(t -> t.getType().equals(TransactionType.END_SHIFT))
.forEach(t -> {
UserSession userSession = new UserSession();
// get id and start date from the linked START_SHIFT in the map
Transaction startShift = map.get(t.getLinkedTransaction());
userSession.setId(startShift.getId());
userSession.setStartDate(startShift.getTransactionDate());
userSession.setEndDate(t.getTransactionDate());
userSessions.add(userSession);
});
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论