我有一个包含字段
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);