本文介绍了使用Spring Data JDBC在Postgresql中映射Java枚举的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我希望能够将用Java声明的枚举映射到在postgres中创建的枚举。例如,具有以下内容: 创建类型EYE_COLOR AS ENUM(棕色,蓝色 , '绿色'); 创建表人( ID INT PRIMARY KEY AUTO_INCREMENT, NAME NVARCHAR2(128)NOT NULL, EYE EYE_COLOR ); 在Java中,我有这样的东西: 公共枚举EyeColor {棕色,蓝色,绿色} 公共类人{ @Id 长ID; 字符串名称; EyeColor眼睛; } 当我尝试将某些内容保存到数据库中时: personRepository.save(new Person( test,EyeColor.BROWN)) sql日志似乎正常: 执行准备好的SQL语句[INSERT INTO person(name,eye)VALUES(?,?)] osjdbc.core.StatementCreatorUtils:设置SQL语句参数值:列索引1,参数值[test],值类[java.lang.String],SQL类型12 osjdbc.core.StatementCreatorUtils:设置SQL语句参数值:列索引2,参数值[BROWN],值类[java.lang.String], SQL类型12 ,但是在实际数据库字段中,我得到一个异常文本: org.h2.jdbc.JdbcSQLException:常规错误: java.lang.RuntimeException:type = 25 [50000-196] at org.h2.message.DbException.getJdbcSQLE xception(DbException.java:345)在org.h2.message.DbException.get(DbException.java:168)在org.h2.message.DbException.convert(DbException.java:295) 在org.h2.message.DbException.toSQLException(DbException.java:268)在org.h2.message.TraceObject.logAndConvert(TraceObject.java:352)在org.h2 .jdbc.JdbcResultSetMetaData.getColumnClassName(JdbcResultSetMetaData.java:376)在com.intellij.database.remote.jdbc.impl.RemoteResultSetImpl.getObject(RemoteResultSetImpl.java:1269)在com.intellij.database .remote.jdbc.impl.RemoteResultSetImpl.getCurrentRow(RemoteResultSetImpl.java:1249)在com.intellij.database.remote.jdbc.impl.RemoteResultSetImpl.getObjects(RemoteResultSetImpl.java:1229)在sun .reflect.GeneratedMethodAccessor13.invoke(未知源)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java.lang.reflect.Method.invoke(Method.java:498) a t sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)在sun.rmi.transport.Transport $ 1.run(Transport.java:200)在sun.rmi.transport。 Transport $ 1.run(Transport.java:197)在java.security.AccessController.doPrivileged(本机方法)在sun.rmi.transport.Transport.serviceCall(Transport.java:196)在sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)在sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(TCPTransport.java:826)在sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.lambda $ run $ 0(TCPTransport.java:683)在java.security.AccessController.doPrivileged(本机方法)在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)在java.lang.Thread.run(Threa d.java:745)原因: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 我也尝试使用ENUM定义,就像他们在列定义内的H2驱动程序规范中所说的那样,但仍然没有用: 创建表人( ID INT PRIMARY KEY AUTO_INCREMENT, NAME NVARCHAR2(128)NOT NULL, EYE枚举('BROWN','BLUE','GREEN')); 解决方案当前在Spring中没有对Postgres枚举的特殊支持数据JDBC。 但如下所述: https://stackoverflow.com / a / 40356977/66686 Postgres枚举将需要一些特殊的SQL语法来进行操作。 这可以为问题提供以下解决方案: 使用 VARCHAR 代替 ENUM 使用带有特殊枚举语法的 @Query 注释方法。仅当您的汇总仅包含一个实体时,这才可行。 I want to be able to map a enum declared in java to an enum created in postgres. For example having the following:CREATE TYPE EYE_COLOR AS ENUM ('BROWN', 'BLUE', 'GREEN');CREATE TABLE PERSON ( ID INT PRIMARY KEY AUTO_INCREMENT, NAME NVARCHAR2(128) NOT NULL, EYE EYE_COLOR);In java I have something like this:public enum EyeColor { BROWN, BLUE, GREEN}public class Person { @Id Long id; String name; EyeColor eye;}When I try to do save something to the database like this:personRepository.save(new Person("test", EyeColor.BROWN))the sql log seems fine: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 12but inside the actual database field I get an exception text: 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=25If I replace the EYE_COLOR type to NVARCHAR2(128) in the postgres column definition everything works fine. An actual "BROWN" value is inserted.Any ideas how this should be implemented?LE: Forgot to add my spring database driver:spring.datasource.driver-class-name=org.h2.Driverspring.datasource.url=jdbc:h2:file:path/to/file;DB_CLOSE_DELAY=-1;MODE=PostgreSQL;AUTO_SERVER=TRUEI also tried using the ENUM definition like they say in the H2 driver specifications directly inside the column definition, but is still didn't work:CREATE TABLE PERSON ( ID INT PRIMARY KEY AUTO_INCREMENT, NAME NVARCHAR2(128) NOT NULL, EYE ENUM ('BROWN', 'BLUE', 'GREEN')); 解决方案 Currently there is no special support for Postgres enums in Spring Data JDBC.But as described here: https://stackoverflow.com/a/40356977/66686 Postgres enums would need some special SQL syntax to get manipulated.This allows for the following possible solutions of the problem:use a VARCHAR instead of an ENUM in the databaseuse a @Query annotated method using the special syntax for the enum. This is only feasible if your aggregate consists only of a single entity. 这篇关于使用Spring Data JDBC在Postgresql中映射Java枚举的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!