这是我的实体
@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 不自动进行类型转换?
根据您实际的 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 语言中的枚举不区分大小写,而您的具体定义是蛇形大小写。