在使用Spring Data JPA时,一不小心就会出现java.sql.SQLDataException: Cannot determine value type from string xxx
的bug,这个问题是由于实体类与数据库表之间的映射出现不一致。通产有以下几种情况:
- 数据库字段与实体类属性名不一致
- 数据库字段与实体类属性类型不一致
- 实体类中属性为枚举或其他实体类
对于以上第一或第二种情况,只需要修改属性名或属性类型即可。如果是由于使用了枚举而导致该问题的出现,则可通过以下两种方式:
一、使用@Enumerated(EnumType.STRING)
由于枚举中默认使用的是@Enumerated(EnumType.ORDINAL),所以该属性则在数据库中将以int(11)
进行存储。所以,如果数据库中的是char或varchar,则需要在属性上添加注解@Enumerated(EnumType.STRING)
,如:
- POJO
@Enumerated(EnumType.STRING)
private SexType sex;
- enum
public enum SexType {
M("男"),
F("女“);
// 此处省略其他方法
}
注意:该枚举中的name必须和数据库中的值一致才可以使用该注解。如上,只有在数据表中sex的值为
M
和F
才可以使用上面方法,如果数据表中为‘男’和‘女’则不适用,此时,可以使用下面的转换器。
二、使用@Convert
- 枚举类:
package import com.demo.enumeration; public enum SexType { M("男"), F("女"); private String name; SexType (String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public static SexType parse(String name) { for (SexType type : SexType .values()) { if (type.name.equals(name)) { return type; } } return null; } @Override public String toString() { return this.name; } }
- 转换器Convert
package com.demo.converter; import com.demo.enumeration.SexType; import javax.persistence.AttributeConverter; public class SexTypeConverter implements AttributeConverter<SexType, String> { @Override public String convertToDatabaseColumn(SexType attribute) { return attribute.getName(); } @Override public SexType convertToEntityAttribute(String dbData) { return SexType.parse(dbData); } }
- POJO
// ... @Convert(converter = SexTypeConverter.class) private SexType type; // ...