【发布时间】:2021-11-24 14:49:09
【问题描述】:
public interface Client {
Long getId();
@JsonFormat(shape = JsonFormat.Shape.STRING)
LocalDate getCreated_dt();
String getUsername();
String getName();
int getAmount();
String getStatus();
String getAccount();
String getExternal_id();
String getExternal_status();
}
DTO
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ClientDto {
private Long id;
@JsonFormat(shape = JsonFormat.Shape.STRING)
private LocalDate created_dt;
private String username;
private String name;
private int amount;
private String status;
private String account;
private String external_id;
private String external_status;
public ClientDto(Client client) {
this.id = client.getId();
/...
/...
this.external_status = client.getExternal_status();
}
public ClientDto(ClientDto clientDto) {
this.id = clientDto.getId();
/...
this.external_status = clientDto.getExternal_status();
}
public ClientDto(ClientEntity clientEntity) {
}
@Override
public String toString() {
return "" + id + "|" + created_dt + "|" + username + "|" + name +
"|" + amount + "|" + status + "|" + account + "|" + external_id + "|" + external_status;
}
}
实体
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Immutable
@Entity
@Table(name = "payments", schema = "public")
public class ClientEntity {
@Id
private Long id;
@Column(name = "created_dt")
private LocalDate created_dt;
@Column(name = "username")
private String username;
@Column(name = "name")
private String name;
@Column(name = "amount")
private int amount;
@Column(name = "status")
private String status;
@Column(name = "account")
private String account;
@Column(name = "external_id")
private String external_id;
@Column(name = "external_status")
private String external_status;
}
存储库
@Repository
public interface ClientRepository extends JpaRepository<ClientEntity, Long> {
@Modifying
@Transactional
@Query(value = "SELECT pp.id, TO_CHAR(pp.created_dt::date, 'dd.mm.yyyy')\n" +
"AS 'Data', CAST(pp.created_dt AS time(0)) AS 'Time', au.username AS 'UserName',\n" +
"ss.name AS 'Service', pp.amount AS 'Amount',\n" +
"REPLACE(pp.status, 'SUCCESS', 'Success') AS 'Payment_status', pp.account AS 'Account',\n" +
"pp.external_id AS 'Idn', COALESCE(pp.external_status, null, 'DN')\n" +
"AS 'Stat'\n" +
"FROM payments AS pp\n" +
"INNER JOIN user AS au ON au.id = pp.creator_id\n" +
"INNER JOIN services AS ss ON ss.id = pp.service_id\n" +
"WHERE pp.created_dt >= '2021-09-28'\n" +
"AND ss.name = 'Faberlic' AND pp.status = 'SUCCESS'", nativeQuery = true)
List<Client> getAllByRegDate();
}
服务
@Service
public class ClientServiceImpl implements ClientService {
private final ClientRepository clientRepository;
@Autowired
public ClientServiceImpl(ClientRepository clientRepository) {
this.clientRepository = clientRepository;
JaroWinklerDistance jaroWinklerDistance = new JaroWinklerDistance();
}
@Override
public List<ClientDto> getAll() {
return clientRepository.findAll()
.stream()
.map(ClientDto::new)
.collect(Collectors.toList());
}
@Override
public Page<ClientEntity> getAll(Pageable paging) {
return clientRepository.findAll(paging);
}
@Override
public List<ClientDto> getAllByRegDateAfter() {
return clientRepository.getAllByRegDate()
.stream()
.map(ClientDto::new)
.collect(Collectors.toList());
}
@Override
public DefaultExcelGeneratorServiceImpl<ClientDto> exportToExcel() {
List<ClientDto> list = this.getAll();
ExcelView excelView = new ExcelView();
List<ExcelView> views = excelView.viewBuilder();
return new DefaultExcelGeneratorServiceImpl<>(list, views);
}
}
public interface ClientService {
public List<ClientDto> getAll();
public Page<ClientEntity> getAll(Pageable paging);
public List<ClientDto> getAllByRegDateAfter();
DefaultExcelGeneratorServiceImpl<ClientDto> exportToExcel();
}
调度器
@Component
public class SchedulerService {
private final ClientService clientService;
@Autowired
public SchedulerService(ClientService clientService) {
this.clientService = clientService;
}
@Scheduled(fixedRate = 5000)
public void downloadBlockedClients() {
try {
List<ClientDto> clientDtos = clientService.getAll().stream().map(ClientDto::new).collect(Collectors.toList());
String fileName = "select.csv";
File file = new File(fileName);
FileOutputStream outputStream = new FileOutputStream(file);
Writer writer = Channels.newWriter(outputStream.getChannel(), "UTF-8");
writer.append("id|created_dt|username|name|amount|status|account|external_id|external_status").append("\n");
for (ClientDto dto : clientDtos) {
writer.append(dto.toString()).append("\n");
}
} catch (Exception e) {
e.printStackTrace();
}
我正在从数据库中进行选择并尝试将这些数据保存到 csv 文件中。没有错误。但是,csv 文件保持空白。
也许这是我使用的方法中的一个问题,或者更确切地说是使用实体的问题。我找不到答案。
另外,created_at 必须分成两列(一列用于日期,另一列用于时间)。
【问题讨论】:
-
您的查询是本地的,您是否在数据库上运行过它以查看它是否有效并返回结果?如果是,则尝试在
List<ClientDto> clientDtos = clientService.getAll().stream().map(ClientDto::new).collect(Collectors.toList());调试您的SchedulerService,并检查此List<ClientDto>是否不为空。如果上述所有工作正常,请检查您的ClientDto#toString()方法是否产生任何结果。
标签: java sql spring postgresql