Java&MySQL Type Mapping

本文详细介绍了MySQL数据库中各种数据类型的Java映射情况。包括数值类型如INT、BIGINT等,日期时间类型如DATE、DATETIME等,以及字符串类型如VARCHAR、CHAR等的映射细节。

MySQL Type Name

Return value of

GetColumnClassName

Returned as Java Class

BIT(1) (new in MySQL-5.0)

BIT

java.lang.Boolean

BIT( > 1) (new in MySQL-5.0)

BIT

byte[]

TINYINT

TINYINT

java.lang.Boolean if the configuration property tinyInt1isBit is set to true (the default) and the storage size is 1, orjava.lang.Integer if not.

BOOL, BOOLEAN

TINYINT

See TINYINT, above as these are aliases forTINYINT(1), currently.

SMALLINT[(M)] [UNSIGNED]

SMALLINT [UNSIGNED]

java.lang.Integer (regardless ifUNSIGNED or not)

MEDIUMINT[(M)] [UNSIGNED]

MEDIUMINT [UNSIGNED]

java.lang.Integer, if UNSIGNEDjava.lang.Long (C/J 3.1 and earlier), orjava.lang.Integer for C/J 5.0 and later

INT,INTEGER[(M)] [UNSIGNED]

INTEGER [UNSIGNED]

java.lang.Integer, if UNSIGNEDjava.lang.Long

BIGINT[(M)] [UNSIGNED]

BIGINT [UNSIGNED]

java.lang.Long, if UNSIGNEDjava.math.BigInteger

FLOAT[(M,D)]

FLOAT

java.lang.Float

DOUBLE[(M,B)]

DOUBLE

java.lang.Double

DECIMAL[(M[,D])]

DECIMAL

java.math.BigDecimal

DATE

DATE

java.sql.Date

DATETIME

DATETIME

java.sql.Timestamp

TIMESTAMP[(M)]

TIMESTAMP

java.sql.Timestamp

TIME

TIME

java.sql.Time

YEAR[(2|4)]

YEAR

If yearIsDateType configuration property is set to false, then the returned object type isjava.sql.Short. If set to true (the default), then the returned object is of typejava.sql.Date with the date set to January 1st, at midnight.

CHAR(M)

CHAR

java.lang.String (unless the character set for the column is BINARY, then byte[] is returned.

VARCHAR(M) [BINARY]

VARCHAR

java.lang.String (unless the character set for the column is BINARY, then byte[] is returned.

BINARY(M)

BINARY

byte[]

VARBINARY(M)

VARBINARY

byte[]

TINYBLOB

TINYBLOB

byte[]

TINYTEXT

VARCHAR

java.lang.String

BLOB

BLOB

byte[]

TEXT

VARCHAR

java.lang.String

MEDIUMBLOB

MEDIUMBLOB

byte[]

MEDIUMTEXT

VARCHAR

java.lang.String

LONGBLOB

LONGBLOB

byte[]

LONGTEXT

VARCHAR

java.lang.String

ENUM('value1','value2',...)

CHAR

java.lang.String

SET('value1','value2',...)

CHAR

java.lang.String

转载于:https://www.cnblogs.com/treerain/p/java_mysql_mapping.html

<think>我们正在处理用户的问题:"HibernateNoDialectmappingforJDBCtype1111solution"根据引用资料,我们注意到Hibernate在运行过程中需要处理数据库方言(Dialect)的映射问题。错误信息“NoDialectmappingforJDBCtype1111”表明Hibernate在当前的方言配置中找不到JDBC类型1111(对应的是SQL中的其他类型,可能是JSON、枚举或自定义类型)的映射。解决思路:1.确认使用的数据库方言是否正确。2.检查是否使用了数据库不支持的数据类型(如PostgreSQL的JSON类型)。3.为特定的JDBC类型注册自定义的Hibernate类型映射。具体步骤:-首先,确认方言配置。例如,使用PostgreSQL应配置为`org.hibernate.dialect.PostgreSQLDialect`(或具体版本,如`PostgreSQL82Dialect`)。-其次,如果使用了自定义类型(如JSON),需要在方言中注册该类型。可以通过继承现有的方言并重写`contributeTypes`方法来实现。示例解决方案(以PostgreSQL和JSON类型为例):1.创建自定义方言类:```javapublicclassCustomPostgreSQLDialectextendsPostgreSQL82Dialect{publicCustomPostgreSQLDialect(){super();this.registerColumnType(Types.OTHER,"json");//或者对于较新的Hibernate版本(5.2+),可以使用://this.registerHibernateType(Types.OTHER,"JsonType");}}```2.在Hibernate配置文件中使用这个自定义方言:```xml<propertyname="hibernate.dialect">com.yourpackage.CustomPostgreSQLDialect</property>```3.如果问题是由枚举类型引起的,可以尝试在实体字段上使用`@Enumerated(EnumType.STRING)`注解,将枚举存储为字符串而不是序号(默认是序号,可能被映射为数字类型,而数据库可能期望其他类型)。4.如果使用的是Hibernate5.2及以上版本,并且遇到JSON类型的问题,可以考虑使用`JsonType`(需要额外依赖,如`hibernate-types`库):-添加依赖:```xml<dependency><groupId>com.vladmihalcea</groupId><artifactId>hibernate-types-52</artifactId><version>2.10.4</version></dependency>```-在实体类中,使用注解:```java@TypeDef(name="json",typeClass=JsonType.class)publicclassYourEntity{@Type(type="json")privateYourJsonObjectyourField;}```5.如果问题仍然存在,检查数据库驱动版本是否与Hibernate版本兼容。注意事项:-错误中的JDBCtype1111对应于`java.sql.Types.OTHER`,通常用于数据库特定的类型(如PostgreSQL的json、jsonb,或者枚举等)。-确保数据库表结构中的列类型与实体中定义的类型匹配。如果以上方法都不能解决,可能需要检查具体的SQL语句和数据库表结构,以确定是哪个字段引发了该错误。相关问题:1.如何配置Hibernate的数据库方言?2.在Hibernate中如何处理JSON类型的数据?3.Hibernate如何自定义类型映射?4.如何解决Hibernate中的枚举类型映射问题?</think>### Hibernate解决"No Dialect mapping for JDBC type 1111"错误 **问题原因分析** 该错误发生在Hibernate无法将数据库返回的JDBC类型1111(对应`java.sql.Types.OTHER`)映射到Java类型时[^1][^2]。常见场景包括: 1. **数据库特定类型**:如PostgreSQL的`JSON/JSONB`、MySQL的`ENUM`或自定义类型 2. **函数返回值**:数据库函数返回未映射的类型 3. **方言缺失**:未正确配置数据库方言 --- ### 解决方案 #### 方法1:注册自定义数据类型(推荐) ```java // 步骤1:创建自定义方言类 public class CustomPostgresDialect extends PostgreSQLDialect { public CustomPostgresDialect() { super(); registerColumnType(Types.OTHER, "jsonb"); // 映射JSONB类型 // 或注册Hibernate类型:registerHibernateType(1111, "JsonType"); } } // 步骤2:在配置中指定方言 hibernate.dialect = com.example.CustomPostgresDialect ``` #### 方法2:实体类显式指定类型 ```java @Entity public class User { @Column(columnDefinition = "jsonb") // 强制指定列类型 private String preferences; @Type(type = "com.vladmihalcea.hibernate.type.json.JsonType") // 使用Hibernate-Types库 private Map<String, Object> settings; } ``` #### 方法3:SQL查询中显式转换 ```sql /* 在HQL或原生SQL中转换类型 */ SELECT CAST(user.data AS text) FROM User user ``` #### 方法4:添加Hibernate-Types依赖(复杂类型) ```xml <!-- pom.xml --> <dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-55</artifactId> <version>2.14.0</version> </dependency> ``` --- ### 关键检查点 1. **确认数据库方言** 检查`hibernate.dialect`配置是否匹配实际数据库[^2] ```properties # PostgreSQL示例 hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect ``` 2. **验证驱动兼容性** JDBC驱动版本需与数据库版本兼容,例如: - PostgreSQL: 使用`postgresql-42.x.x.jar` - MySQL: 使用`mysql-connector-java-8.x.x.jar` 3. **检查DDL一致性** 确保实体类字段定义与数据库列类型匹配,如: ```sql -- PostgreSQL的JSON列 ALTER TABLE users ADD COLUMN metadata JSONB; ``` --- ### 典型应用场景 1. **处理JSON数据** 使用`hibernate-types`库映射JSON字段[^4] 2. **枚举类型处理** 通过`@Enumerated(EnumType.STRING)`避免数字映射 3. **GIS空间数据** 使用`PostGIS`方言处理地理数据类型 > **注意**:JDBC type 1111是通用类型代码,具体解决方案需根据实际数据库类型调整[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值