JPA 端点的查询需要显式类型转换

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

我目前正在做一个端点,通过

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) }
        }
    }
postgresql kotlin jpa enums
1个回答
0
投票

问题是枚举只能自动转换为原始

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>
© www.soinside.com 2019 - 2024. All rights reserved.