Grails类型映射咨询:Boolean映射为Tinyint而非BIT,求完整映射列表
Grails SQL类型映射完整指南:解决Boolean映射差异问题
我之前在对接旧数据库时也遇到过一模一样的困惑——明明Hibernate文档里说Boolean映射成BIT,可Grails默认给我生成了Tinyint。其实这是因为Grails的GORM虽然基于Hibernate,但为了适配不同数据库的默认行为,做了针对性调整,Tinyint就是MySQL这类数据库下Boolean类型的默认映射值。
下面我整理了Grails域类常用类型到SQL类型的默认映射列表(覆盖主流数据库如MySQL、PostgreSQL、SQL Server),以及确认和自定义映射的方法:
常见类型默认映射列表
- Boolean/boolean:
- MySQL/MariaDB:
TINYINT(1) - PostgreSQL:
BOOLEAN - SQL Server:
BIT
- MySQL/MariaDB:
- String:
- 默认:
VARCHAR(255);若指定maxSize: 1000,MySQL会映射为TEXT,其他数据库则为VARCHAR(1000)
- 默认:
- Integer/int:
INT - Long/long:
BIGINT - Double/double:
DOUBLE - Float/float:
FLOAT - BigDecimal:默认
DECIMAL(19,2),可通过scale和precision约束调整精度 - Date:
- MySQL:
DATETIME - PostgreSQL:
TIMESTAMP - SQL Server:
DATETIME
- MySQL:
- LocalDate:
DATE - LocalDateTime:
TIMESTAMP - byte[]:
BLOB(二进制大对象) - Enum:默认映射为
VARCHAR(255)存储枚举名称;可通过sqlType: 'INT'改为存储枚举索引值
确认当前项目的实际映射
如果想精准确认你的项目中每个属性的SQL映射,可以开启Hibernate的SQL日志:
在application.yml中添加配置:
logging: level: org.hibernate.SQL: DEBUG org.hibernate.type.descriptor.sql: TRACE
启动项目后,控制台会打印出完整的建表SQL语句,你能清晰看到每个域类属性对应的SQL类型。
自定义类型映射
正如你所知,若要强制修改某个属性的映射类型,直接在约束中指定sqlType即可:
class YourDomainClass { Boolean isActive static constraints = { isActive sqlType: 'BIT' } }
需要注意的是,不同Grails版本(比如3.x vs 4.x vs 5.x)因为底层依赖的Hibernate版本不同,映射可能有细微差异,建议结合你当前使用的Grails版本的官方GORM文档来核对细节。
内容的提问来源于stack exchange,提问作者Anwar Benhamada




