【问题标题】:When exporting from the database, an empty csv file is created从数据库导出时,会创建一个空的 csv 文件
【发布时间】: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&lt;ClientDto&gt; clientDtos = clientService.getAll().stream().map(ClientDto::new).collect(Collectors.toList()); 调试您的SchedulerService,并检查此List&lt;ClientDto&gt; 是否不为空。如果上述所有工作正常,请检查您的 ClientDto#toString() 方法是否产生任何结果。

标签: java sql spring postgresql


【解决方案1】:

必须调用Writerclose()方法,否则不会写 文件中的当前缓冲区。

将此代码添加到 try 块的末尾:

...
writer.close();
...

或创建一个 finally 块。

【讨论】:

  • @Аристотель 正如你所说,列名保存在文件中。但是数据库中的数据没有显示...
  • 好的,现在我们解决写作问题。让我们检查一下如何从数据库中获取数据。如果我发现问题,我会更新我的答案。在您的 ClientService getAll() 方法中存在一个问题,您已经将结果收集到 List 为什么当您在 ScheduledService 调用 service.getAll() 时再次这样做?
  • 我还是新手)我再次调用它是因为我找到了正确的代码。我想问题就在这里。但是直到最后我的经验仍然没有让我清楚......
  • 在sql中查询时,一切都显示正确。我的查询中的 created_dt 列也分为两列 - 日期和时间。形成 csv 文件时,我没有显示它。也许这也是问题所在?
  • 您能否检查您检索到的 List 是否为空?通过添加断点来调试您的代码并检查您的调用是否返回任何内容。从您的 ClientService 开始并打印列表而不将其映射到 ClientDto。如果您得到正确的回答,请查看那里。然后在将其映射到 ClientDto 时打印。只是为了检查映射是否正确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
相关资源
最近更新 更多