用Spring数据JDBC映射Postgresql中的Java枚举

用Spring数据JDBC映射Postgresql中的Java枚举,java,postgresql,enums,spring-data-jdbc,Java,Postgresql,Enums,Spring Data Jdbc,我希望能够将java中声明的枚举映射到postgres中创建的枚举。例如,具有以下特征: 创建类型EYE_COLOR作为枚举('BROWN'、'BLUE'、'GREEN'); 创建表格人员( ID INT主键自动递增, 名称NVARCHAR2(128)不为空, 眼睛颜色 ); 在java中,我有如下内容: public enum EyeColor{ 布朗, 蓝色 绿色 } 公共阶层人士{ @身份证 长id; 字符串名; 眼睛颜色; } 当我尝试将某些内容保存到数据库时,如下所示: perso

我希望能够将java中声明的枚举映射到postgres中创建的枚举。例如,具有以下特征:

创建类型EYE_COLOR作为枚举('BROWN'、'BLUE'、'GREEN');
创建表格人员(
ID INT主键自动递增,
名称NVARCHAR2(128)不为空,
眼睛颜色
);
在java中,我有如下内容:

public enum EyeColor{
布朗,
蓝色
绿色
}
公共阶层人士{
@身份证
长id;
字符串名;
眼睛颜色;
}
当我尝试将某些内容保存到数据库时,如下所示:

personRepository.save(新人(“测试”,EyeColor.BROWN))
sql日志似乎很好:

Executing prepared SQL statement [INSERT INTO person (name, eye) VALUES (?, ?)]
 o.s.jdbc.core.StatementCreatorUtils      : Setting SQL statement parameter value: column index 1, parameter value [test], value class [java.lang.String], SQL type 12
 o.s.jdbc.core.StatementCreatorUtils      : Setting SQL statement parameter value: column index 2, parameter value [BROWN], value class [java.lang.String], SQL type 12
但在实际数据库字段中,我得到一个异常文本:

org.h2.jdbc.JdbcSQLException: General error: "java.lang.RuntimeException: type=25" [50000-196]  
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)     
at org.h2.message.DbException.get(DbException.java:168)     
at org.h2.message.DbException.convert(DbException.java:295)     
at org.h2.message.DbException.toSQLException(DbException.java:268)  
at org.h2.message.TraceObject.logAndConvert(TraceObject.java:352)   
at org.h2.jdbc.JdbcResultSetMetaData.getColumnClassName(JdbcResultSetMetaData.java:376)     
at com.intellij.database.remote.jdbc.impl.RemoteResultSetImpl.getObject(RemoteResultSetImpl.java:1269)  
at com.intellij.database.remote.jdbc.impl.RemoteResultSetImpl.getCurrentRow(RemoteResultSetImpl.java:1249)  
at com.intellij.database.remote.jdbc.impl.RemoteResultSetImpl.getObjects(RemoteResultSetImpl.java:1229)     
at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)     
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    
at java.lang.reflect.Method.invoke(Method.java:498)     
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)  
at sun.rmi.transport.Transport$1.run(Transport.java:200)    
at sun.rmi.transport.Transport$1.run(Transport.java:197)    
at java.security.AccessController.doPrivileged(Native Method)   
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)  
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)     
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)     
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)     
at java.security.AccessController.doPrivileged(Native Method)   
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)  
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)  
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)  
at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.RuntimeException: type=25
如果我在postgres列定义中将EYE_COLOR类型替换为NVARCHAR2(128),则一切正常。插入一个实际的“棕色”值

有什么想法应该如何实施吗

LE:忘记添加我的spring数据库驱动程序:

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:file:path/to/file;DB_CLOSE_DELAY=-1;MODE=PostgreSQL;AUTO_SERVER=TRUE
我还尝试使用枚举定义,就像H2驱动程序规范中所说的那样,直接在列定义中使用,但仍然不起作用:

createtableperson(
ID INT主键自动递增,
名称NVARCHAR2(128)不为空,
眼睛枚举(“棕色”、“蓝色”、“绿色”)
);

目前,Spring数据JDBC中没有对Postgres枚举的特殊支持

但正如这里所描述的:Postgres枚举需要一些特殊的SQL语法来进行操作

这允许以下可能的问题解决方案:

  • 在数据库中使用
    VARCHAR
    而不是
    ENUM
  • 使用枚举的特殊语法,使用带注释的方法
    @Query
    。这仅在聚合仅由单个实体组成时才可行

  • 它会将异常写入字段吗?这很奇怪。stacktrace到处都是h2,但是你的标签上是postgresql。那是哪一个呢?我编辑了答案并添加了我的驾驶员详细信息,似乎与此相关。特别是因为他说把它当作字符串处理很好:谢谢你的快速回答,现在我们将使用字符串解决方案。