我正在使用 Spring Data JPA 開發一個 Spring Boot 專案,我想知道是否存在針對以下用例的漂亮而優雅的解決方案。
最初我有一個這樣的服務方法(它作業正常):
@Override
public Page<LogDTO> findAll(Integer logType, LocalDateTime startDate, LocalDateTime endDate, Pageable pageable) throws NotFoundException {
if(startDate == null) startDate = LocalDateTime.of(1900,1,1,0,0,0);
if(endDate == null) endDate = LocalDateTime.now();
Page<EventLog> eventLogs = null;
if(logType != null) {
Optional<LogType> logTypeEntity = logTypeRepository.findById(logType);
logTypeEntity.orElseThrow( () -> new NotFoundException(String.format("Log type doesn't exists with id: ", Integer.toString(logType))));
eventLogs = logRepository.findByLogTypeAndTimestampBetween(logTypeEntity.get(),startDate,endDate, pageable);
} else {
eventLogs = logRepository.findByTimestampBetween(startDate,endDate,pageable);
}
return eventLogs.map(m -> conversionService.convert(m, LogDTO.class));
}
正如您在這個舊方法中看到的那樣,采用表示單個日志型別 ID 的Integer logType輸入引數。然后通過以下方式檢索相關的LogType物件:
Optional<LogType> logTypeEntity = logTypeRepository.findById(logType);
并使用此logTypeEntity實體來檢索與此特定單個檢索LogType相關的所有EventLog物件,通過以下行:
eventLogs = logRepository.findByLogTypeAndTimestampBetween(logTypeEntity.get(),startDate,endDate, pageable);
現在我正在重構這個方法,以嘗試獲取與多個LogType相關的日志。所以我以這種方式改變我原來的服務方法:
@Override
public Page<LogDTO> findAll(List<Integer> logTypesList,
LocalDateTime startDate,
LocalDateTime endDate,
Pageable pageable) throws NotFoundException {
if(startDate == null) startDate = LocalDateTime.of(1900,1,1,0,0,0);
if(endDate == null) endDate = LocalDateTime.now();
Page<EventLog> eventLogs = null;
if(logTypesList != null & logTypesList.size() > 0) {
Optional<LogType> logTypeEntity = logTypeRepository.findById(logType);
logTypeEntity.orElseThrow( () -> new NotFoundException(String.format("Log type doesn't exists with id: ", Integer.toString(logType))));
eventLogs = logRepository.findByLogTypeAndTimestampBetween(logTypeEntity.get(),startDate,endDate, pageable);
} else {
eventLogs = logRepository.findByTimestampBetween(startDate,endDate,pageable);
}
return eventLogs.map(m -> conversionService.convert(m, LogDTO.class));
}
如您所見,我的服務方法現在采用List logTypesList引數而不是單個Integer logType)。然后在我的代碼中,我正在檢查這個串列是否包含元素。
現在我想知道 Spring Data JPA 中是否存在一種智能方法來替換這一行:
Optional<LogType> logTypeEntity = logTypeRepository.findById(logType);
為了檢索屬于我的List logTypesList中包含的所有 ID 的 LogType 的集合。我知道我可以簡單地對該集合進行互動并將檢索到的物件添加到結果串列中,但我想知道是否可以以更智能的方式實作此行為。
在與如何以智能和優雅的方式替換此行有關的類似疑問之后:
eventLogs = logRepository.findByLogTypeAndTimestampBetween(logTypeEntity.get(),startDate,endDate, pageable);
是否存在傳遞LogType物件集合以檢索所有回傳的LogEvent物件的方法?
uj5u.com熱心網友回復:
這個(findAllById)應該作業
List<T> findAllById(Iterable<ID> var1);
uj5u.com熱心網友回復:
請查看 session.byMultipleIds multiLoad
https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/Session.html
它會是這樣的:
List<LogType> logTypes = session.byMultipleIds( LogType.class ).multiLoad( 1L, 2L, 3L );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/428678.html
