使用jOOQ查询从CSV返回所有记录

问题描述 投票:0回答:1

我正在尝试创建一个端点,该端点将返回 csv 文件以供下载。到目前为止,我有一个在响应中返回 json 的端点,我想简单地将 json 更改为 csv,但不要像 json 那样分页(因为它就在那里)。

@GetMapping("/csv", produces = ["text"])
    @ResponseStatus(HttpStatus.OK)
    fun getCsv(
        response: HttpServletResponse,
        @ParameterObject @Valid filterData: TransactionFilter
    ) {
        val csv: String = transactionGetter.getTransactionCsv(filterData.toQuery())
        ResponseStreamUtil.copyStreams(response, csv, contentDispositionHeader, contentTypCsv)
    }
}

fun getTransactionCsv(query: TransactionQuery): String {
        val pageSize = 100
        val transaction: org.springframework.data.domain.Page<List<TransactionDetails>> = repository.find(query)
        if (transaction.totalElements > pageSize) {
            throw RowsException(pageSize)
        }
        val transactionCsvs: List<TransactionDetails> = TransactionFactory().create(transaction.content)
        return if (transactionCsvs.isEmpty()) {
            ""
        } else csvGenerator.generate(transactionCsvs)
}

fun find(query: TransactionQuery): org.springframework.data.domain.Page<List<TransactionDetails>>

我在创建对 jOOQ 的查询时遇到问题,以便它返回到目前为止的所有数据,这样的查询看起来像这样,它返回带分页的过滤数据,但如何在不分页的情况下返回列表中的所有记录?

override fun find(query: TransactionQuery, page: Page): Paged<List<TransactionDetails>> {
        val records = dsl.select(fields()).from(TransactionTable.NAME)
            .where(TransactionDetailsConditionBuilder(query).build())
            .limit((page.number - 1) * page.size, page.size + 1)
            .fetch()

        return PagedRecords.from(records, page)
} 


override fun find(query: TransactionQuery): org.springframework.data.domain.Page<List<TransactionDetails>> {
        TODO("Not yet implemented")
}
java spring spring-boot kotlin jooq
1个回答
0
投票

我假设您的意思是您希望避免使用 jOOQ动态 SQL 类型,在这种情况下,您可以在查询中包含或排除

LIMIT
子句,或者编写查询两次,具体取决于导出模式。

您始终可以将

DSL::noField
传递给
LIMIT
子句,以对
.limit()
进行无操作调用:

.limit(isCsv
  ? noField(SQLDataType.INTEGER)
  : (page.number - 1) * page.size, page.size + 1)

将此类条件参数传递给 jOOQ DSL 是 jOOQ 动态 SQL 支持的一部分,知道每个 jOOQ 查询都是动态 SQL 查询,即使由于 DSL 与实际 SQL 的相似性,它看起来像静态查询。

请注意,jOOQ还支持以CSV格式导出数据,所以也许您也可以使用它(从您的问题中我不清楚这是否是您问题的一部分)。

© www.soinside.com 2019 - 2024. All rights reserved.