2016-09-19 308 views
3

我实施这一方案here到“Y” /“N”列转换为布尔值:使用JPA AttributeConverter布尔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 

回答

3

事实证明,因为这个领域是一个varchar /焦炭转化前,JPQL需要把它作为一个字符串。我不确定是否有更好的方法来做到这一点,但以下工作:

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