将转换后的枚举值插入MySql Smallint列时发生JDBC java.sql.SQLException
我试图使用枚举来显示“权限”字段(读、写等)的可读值。当我将记录存储在关联的MySQL表中时,需要将permission enum字段转换为关联的整数(1、2、4等)。但是,当我运行SpringBoot应用程序并调用POST端点时,我遇到了一个奇怪的SQL异常。例外情况如下: 无法执行DbAction.InsertRoot(entity=Invite(id=null,createdAt=2020-09-19 18:12:01,createdBy=1,listId=8,token=c3b95dc9-ec4d-4dde-a461-b12746afa61e,expiresAt=2020-09-26 18:12:01,permission=2),generatedId=null)及其根本原因 java.sql.SQLException:第1行“permission”列的整数值“WRITE”不正确 在com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)~[mysql-connector-java-8.0.19.jar:8.0.19] 我觉得奇怪的是,db操作会报告要插入的“permission”字段是2,而SQL异常报告“WRITE”不是有效的整数值。知道我遗漏了什么吗 下面是值得注意的代码和配置。请注意,我使用的是JDBC而不是JPA: 以下是enum类:将转换后的枚举值插入MySql Smallint列时发生JDBC java.sql.SQLException,mysql,spring,spring-jdbc,enumeration,Mysql,Spring,Spring Jdbc,Enumeration,我试图使用枚举来显示“权限”字段(读、写等)的可读值。当我将记录存储在关联的MySQL表中时,需要将permission enum字段转换为关联的整数(1、2、4等)。但是,当我运行SpringBoot应用程序并调用POST端点时,我遇到了一个奇怪的SQL异常。例外情况如下: 无法执行DbAction.InsertRoot(entity=Invite(id=null,createdAt=2020-09-19 18:12:01,createdBy=1,listId=8,token=c3b95dc9
public enum Permission {
READ(1), WRITE(2), CREATE(4), DELETE(8), ADMIN(16);
private Integer value;
Permission(final Integer value) {
this.value = value;
}
public Integer getValue() {
return this.value;
}
//@JsonCreator
@Override
public String toString() {
return this.getValue().toString();
}
//@JsonValue
public static Permission forValue(final String name) {
return Permission.valueOf(name);
}
}
这里是POJO/实体:
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
@Data
@AllArgsConstructor
@Builder
@ToString
public class Invite {
public static final int TOKEN_MINIMUM_LENGTH = 36;
public static final int TOKEN_MAXIMUM_LENGTH = 40;
@Id
private Long id;
private String createdAt;
private String createdBy;
private Long listId;
private String token;
private String expiresAt;
private Permission permission;
}
下面是JdbcCustomConversions。应该注意的是,在调试时,ReadingConverter似乎会跳闸,但WritingConverter不会。我不确定这是否是问题的一部分
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import java.util.Arrays;
@Configuration
@EnableAutoConfiguration
public class JdbcConfiguration extends AbstractJdbcConfiguration {
/**
* JDBC Custom Conversions.
*
*/
@Override
public JdbcCustomConversions jdbcCustomConversions() {
return new JdbcCustomConversions(Arrays.asList(PermissionToInteger.INSTANCE, IntegerToPermission.INSTANCE));
}
// I have never seen this get tripped
@WritingConverter
enum PermissionToInteger implements Converter<Permission, Integer> {
INSTANCE;
@Override
public Integer convert(final Permission permission) {
return permission == null ? null : permission.getValue();
}
}
// this one trips in the debugger and appears to be working fine
@ReadingConverter
enum IntegerToPermission implements Converter<Integer, Permission> {
INSTANCE;
@Override
public Permission convert(final Integer code) {
for (final Permission perm: Permission.values()) {
if (perm.getValue().equals(code)) {
return perm;
}
}
return null;
}
}
}
导入org.springframework.boot.autoconfigure.EnableAutoConfiguration;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.core.convert.converter.converter;
导入org.springframework.data.convert.ReadingConverter;
导入org.springframework.data.convert.WritingConverter;
导入org.springframework.data.jdbc.core.convert.jdbcustomconversions;
导入org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
导入org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
导入java.util.array;
@配置
@启用自动配置
公共类JdbcConfiguration扩展了AbstractJdbcConfiguration{
/**
*JDBC自定义转换。
*
*/
@凌驾
公共JdbcCustomConversions JdbcCustomConversions(){
返回新的JDBCCustomConversion(Arrays.asList(PermissionToInteger.INSTANCE,integerOperamission.INSTANCE));
}
//我从没见过这个被绊倒
@写转换器
enum PermissionToInteger实现转换器{
实例;
@凌驾
公共整数转换(最终权限){
返回权限==null?null:permission.getValue();
}
}
//这一个在调试器中跳闸,似乎工作正常
@读取转换器
枚举整数操作器实现转换器{
实例;
@凌驾
公共权限转换(最终整数代码){
for(最终权限perm:Permission.values()){
if(perm.getValue().equals(代码)){
回烫;
}
}
返回null;
}
}
}
以下是简单的存储库:
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
import java.util.Optional;
public interface InviteRepository extends CrudRepository<Invite, Long> {
@Query("SELECT * from invite where token = :token")
Optional<Invite> findByToken(String token);
@Query("SELECT * from invite where created_by = :userId")
List<Invite> findByUserId(Long userId);
@Query("SELECT * from invite where list_id = :wishlistId")
List<Invite> findByWishlistId(Long wishlistId);
}
import org.springframework.data.jdbc.repository.query.query;
导入org.springframework.data.repository.crudepository;
导入java.util.List;
导入java.util.Optional;
公共接口存储库扩展了Crudepository{
@查询(“从邀请中选择*,其中标记=:标记”)
可选findByToken(字符串标记);
@查询(“从创建者处选择*:userId”)
列出findByUserId(长用户标识);
@查询(“从邀请列表中选择*。\u id=:wishlistId”)
列表findByWishlistId(Long-wishlistId);
}
任何提示都将不胜感激
Aaron修复方法是将WritingConverter更改为字符串而不是整数:
@WritingConverter
public enum PermissionToInteger implements Converter<Permission, String> {
INSTANCE;
@Override
public String convert(final Permission permission) {
return permission == null ? null : permission.getValue().toString();
}
}
@WritingConverter
公共枚举权限Integer实现转换器{
实例;
@凌驾
公共字符串转换(最终权限){
返回权限==null?null:permission.getValue().toString();
}
}
您需要使用@Enumerated
注释。在这里你可以找到关于这篇文章:还有这篇: