将JPA AttributeConverter用于布尔值Y / N字段:“无法呈现布尔文字值”

时间:2016-09-19 20:06:30

标签: java jpa jpql

我正在实施解决方案here以将'Y'/'N'列转换为布尔值:

@Basic(optional = false)
@Column(name = "ACTIVE_YN")
@Convert(converter = BooleanToStringConverter.class)
private Boolean active;

..和:

@Converter
public class BooleanToStringConverter implements AttributeConverter<Boolean, String> {

    @Override
    public String convertToDatabaseColumn(Boolean value) {
        return (value != null && value) ? "Y" : "N";
    }

    @Override
    public Boolean convertToEntityAttribute(String value) {
        return "Y".equals(value);
    }
}

问题是我似乎无法在JPQL中使用布尔值。以下代码给出了以下错误:

@Query("select thing from MyThing thing where thing.id = :id and thing.active = true")
public MyThing findOneActive(@Param("id") ThingIdEnum id);

错误:

java.lang.IllegalArgumentException: Validation failed for query for method public abstract x.y.z.MyThing x.y.z.MyThingRepository.findOneActive(x.y.z.ThingIdEnum)!
...
Unable to render boolean literal value [select thing from MyThing thing where thing.id = :id and thing.active = true]
...
org.hibernate.type.descriptor.converter.AttributeConverterTypeAdapter cannot be cast to org.hibernate.type.LiteralType

1 个答案:

答案 0 :(得分:3)

事实证明,因为此字段在转换之前是varchar / char,所以JPQL需要将其视为字符串。我不确定是否有更好的方法可以做到这一点,但以下工作:

@Query("select thing from MyThing thing where thing.id = :id and thing.active = 'Y'")
public MyThing findOneActive(@Param("id") ThingIdEnum id);