为什么 JPA Query 不自动转换枚举?

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

这是我的实体

@Entity
@Table(name = "price_project")
class PriceProject(
    @Column val priceEur: Double,
    @Column(name = "valid_from", columnDefinition = "TIMESTAMP WITH TIME ZONE")
    val validFrom: ZonedDateTime?,
    @Enumerated(EnumType.STRING)
    @Column val projectType: ProjectTypes
) {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long = 0
}

这是

enum ProjectTypes

@EnumNaming(EnumNamingStrategies.CamelCaseStrategy::class)
enum class ProjectTypes {
    national,
    international,
    trans_national,
    global,
}

这是表

CREATE
price_project
语句以及
enum project_type

CREATE TABLE public.price_project (
    id bigint NOT NULL,                                                   
    price double precision,
    project_type public.project_types NOT NULL,
    valid_from timestamp with time zone NOT NULL,
);

CREATE TYPE public.project_types AS ENUM (
    'national',
    'international',
    'trans_national',
    'global',
);

现在,我尝试使用

enum ProjectTypes

创建查询
interface ProjectPriceRepository : JpaRepository<ProjectPrice, Long> {
    @Query("""
        SELECT p FROM PriceProject p
        WHERE p.validFrom <= :currentDate AND
        p.activityType = :projectType 
        """)
    fun findProject(
        @Param("projectType") projectType: ProjectTypes,
        @Param("validFrom") currentDate: ZonedDateTime,
    ): PriceProject?
}

但这给了我

执行 SQL 时 JDBC 异常 [select ... from Price_project where ... project_type=? [错误:运算符不存在:project_type = 字符变化 提示:没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。位置:386] [不适用]; SQL [不适用]

为什么 JPA 不自动进行类型转换?

java spring-boot kotlin jpa spring-data-jpa
1个回答
0
投票

根据您实际的 JDBC 驱动程序的实现和您的 ORM 映射器(例如 hibernate),需要向实体类添加其他信息才能解析枚举类型。 盲目地假设您正在使用 POSTGRES 和 hibernate 您可能需要:

@JdbcType(PostgreSQLEnumJdbcType::class) // org-hibernate-orm:hibernate-core
@Enumerated(EnumType.STRING)
@Column
val projectType: ProjectTypes

让映射器能够简单地将枚举作为字符串放入查询中(为什么这不会这么复杂,我不知道)。

至于

@EnumNaming(EnumNamingStrategies.CamelCaseStrategy::class)
enum class ProjectTypes { ...

我不确定这是否与您的数据库对枚举的定义不冲突,因为大多数 SQL 语言中的枚举不区分大小写,而您的具体定义是蛇形大小写。

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