我正在尝试创建一个端点,该端点将返回 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")
}
我假设您的意思是您希望避免使用 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格式导出数据,所以也许您也可以使用它(从您的问题中我不清楚这是否是您问题的一部分)。