列“ACTIVE CHARACTER(1)”的值太长:“TRUE (1)”

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

我有一个包含字段

id
active
的实体。我想编写一个查询,使特定条目处于活动状态并停用其他条目。我使用 JPQL 很重要。

但是,由于某些原因,当我在任何子句中使用内置布尔值时,它们似乎变成了字符串(或其他)类型。所以,我得到了错误

Value too long for column "ACTIVE CHARACTER(1)": "TRUE (1)"

这是我的实体:

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.type.YesNoConverter;

@Entity
@Getter
@Setter
public class ActiveHolder{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Convert(converter = YesNoConverter.class)
    private boolean active;
}

这是我在存储库中的 JPQL:

@Transactional
@Modifying
@Query("UPDATE ActiveHolder u SET u.active = (u.id = :id) " +
        "WHERE u.id = :id OR u.active = true")
int activateById(@Param("id") Long id); // Doesn't work

当我尝试使用

CASE WHEN
语句时,同样的事情发生了。但是当我没有表达式作为参数时它确实有效:

@Transactional
@Modifying
@Query("UPDATE ActiveHolder u SET u.active = true " +
        "WHERE u.id = :id OR u.active = true")
int activateById(@Param("id") Long id); // Works perfectly fine!!!

此外,如果它有任何价值,我在 nativeSql (H2) 中遇到了同样的问题,但已经设法让它与多个演员一起工作:

update active_holder set active=(cast((id = ?) as char)) where ID=? or ACTIVE=cast(TRUE as char);

java spring hibernate jpa jpql
© www.soinside.com 2019 - 2024. All rights reserved.