SQLite 64位整数在jooq中被认为是整数

时间:2014-10-10 21:25:12

标签: java sqlite long-integer jooq

我有一个与jOOQ一起使用的SQLite数据库。 当我使用jOOQ的代码生成工具时,它会按预期构建所有表和记录类。 但是,所有SQLite INTEGER列都会在生成的代码中变为java.lang.Integer个字段。

问题是SQLite INTEGER's最多可以存储一个64位有符号整数,其中java.lang.Integer只是一个32位有符号整数。

是否可以告诉jOOQ对这些列使用java.lang.Long(64位签名)?

1 个答案:

答案 0 :(得分:5)

实际上,SQLite中没有实际的INTEGER数据类型,只有INTEGER affinity,它实际上可以存储多达64位的有符号整数。但是,当您使用DDL时,通常会使用其中一个(大多数)标准"类型名称",可以在CREATE TABLE语句和CAST表达式中使用:

  • INT
  • INTEGER
  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • BIGINT
  • UNSIGNED BIG INT
  • INT2
  • INT8

为了让jOOQ生成java.lang.Long,您需要在BIGINT语句中使用INT8CREATE TABLE之一。如果您使用INTINTEGER,jOOQ将假设您确实打算存储32位有符号整数,从而存储java.lang.Integer值。

重写数据类型

请注意,jOOQ的代码生成器配置还允许您rewrite data types based on column names or column types

<forcedType>
  <!-- Specify any data type from org.jooq.impl.SQLDataType -->
  <name>BIGINT</name>

  <!-- Add a Java regular expression matching fully-qualified columns.
       Use the pipe (union operator) to separate several expressions.
       If provided, both "expressions" and "types" must match. -->
  <expression>.*\.IS_VALID</expression>

  <!-- Add a Java regular expression matching data types to be forced
       to have this type. If provided, both "expressions" and "types" must match. -->
  <types>.*</types>
</forcedType>