我目前正在做一个端点,通过
exchange_request
查找 status
的列表。为此,我在我的存储库中定义了此查询:
@Query("SELECT er FROM ExchangeRequest er WHERE er.status = :status")
fun findByStatus(status: ExchangeRequestStatus): Optional<List<ExchangeRequest>>
我在迁移中定义了这一点:
CREATE TYPE EXCHANGE_REQUEST_STATUS AS ENUM ('PENDING', 'ACCEPTED', 'REJECTED', 'CANCELLED');
CREATE CAST (VARCHAR AS EXCHANGE_REQUEST_STATUS) WITH INOUT AS IMPLICIT;
我已经在互联网上查找了几个小时,它告诉我我需要在查询中进行转换,但是我尝试的每种方法都不断地抛出错误。
我知道如果我使用硬编码状态进行查询,它会起作用:
@Query("SELECT er FROM ExchangeRequest er WHERE er.status = 'PENDING'")
fun findByStatus(status: ExchangeRequestStatus): Optional<List<ExchangeRequest>>
但除此之外我得到了这个:
ERROR: operator does not exist: exchange_request_status = character varying
Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
我的问题是,我应该在哪里以及如何进行演员阵容?
我的实体中也已经有了这个
exchange_request
:
@Column(name = "status", nullable = false)
@Enumerated(EnumType.STRING)
private var status: ExchangeRequestStatus,
并在实体之外定义了它:
enum class ExchangeRequestStatus(val value: String) {
PENDING("PENDING"), ACCEPTED("ACCEPTED"), REJECTED("REJECTED"), CANCELED("CANCELED")
}
如果有必要,这是我的控制器和我的服务:
@GetMapping("/status/{status}")
fun getExchangeRequestByStatus(@PathVariable status: ExchangeRequestStatus): Optional<List<ExchangeRequestDTO>> {
return exchangeRequestService.getByStatus(status)
}
public fun getByStatus(status: ExchangeRequestStatus): Optional<List<ExchangeRequestDTO>> {
val exchangeRequests = exchangeRequestRepository.findByStatus(status)
return exchangeRequests.map { requests ->
requests.map { ExchangeRequestDTO(it) }
}
}
问题是枚举只能自动转换为原始
VARCHAR
。默认情况下,Hibernate 对枚举使用 ORDINAL
策略映射。您的注释@Enumerated
位于属性上,存储库对此一无所知。
第一个解决方案是将
findByStatus
的参数更改为String。
第二个有点变态,不过也许你喜欢))
@Query("select er from ExchangeRequest er where sql('array_position(enum_range(?::EXCHANGE_REQUEST_STATUS), ?::EXCHANGE_REQUEST_STATUS)', er.status, er.status) = sql('(? + 1)', :status) ")
fun findAllByValue(status: ExchangeRequestStatus): List<MyTable>