You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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
  • String
    • 默认:VARCHAR(255);若指定maxSize: 1000,MySQL会映射为TEXT,其他数据库则为VARCHAR(1000)
  • Integer/intINT
  • Long/longBIGINT
  • Double/doubleDOUBLE
  • Float/floatFLOAT
  • BigDecimal:默认DECIMAL(19,2),可通过scaleprecision约束调整精度
  • Date
    • MySQL:DATETIME
    • PostgreSQL:TIMESTAMP
    • SQL Server:DATETIME
  • LocalDateDATE
  • LocalDateTimeTIMESTAMP
  • 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

火山引擎 最新活动