0

我想在 SQL Server 中定义列,以便 Mybatis Generator 生成java.time.Instantjava.time.OffsetDateTime. 根据Mybatis Generator Core,具有类型TIMESTAMP_WITH_TIMEZONE的列映射到OffsetDateTimewhen useJSR310Typesistrue

我在 DDL 中使用了类型DATETIMEOFFSET,但我的实体被翻译为Object. 当然使用DATETIME2results in LocalDateTime,这不是我想要的。

示例 DDL

CREATE TABLE Users
(
    UserId        Int IDENTITY (1,1) NOT NULL,
    UserFirstName Nvarchar(50)       NOT NULL,
    UserLastName  Nvarchar(50)       NOT NULL,
    UserEmail     Nvarchar(100)      NOT NULL,
    Created DATETIME2 NOT NULL,
    Creator INT NOT NULL,
    Modified DATETIME2 NOT NULL,
    Modifier INT NOT NULL
);

相关片段generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "https://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

    <contexttargetRuntime="MyBatis3DynamicSql" defaultModelType="hierarchical">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <jdbcConnection driverClass="${jdbcDriverClass}"
                        connectionURL="${jdbcUrl}"
                        userId="${jdbcUsername}"
                        password="${jdbcPassword}"
        >
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>

        <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
            <property name="useJSR310Types" value="true"/>
        </javaTypeResolver>

        <javaModelGenerator targetPackage=""
                            targetProject="${workingDir}/src/main/java"/>

        <javaClientGenerator targetPackage=""
                             targetProject="${workingDir}/src/main/java" type="ANNOTATEDMAPPER"/>

        
        <table tableName="Users" domainObjectName="User" mapperName="UserBaseMapper">
            <property name="rootInterface" value=""/>
            <generatedKey column="UserId" identity="true" sqlStatement="JDBC"/>
        </table>

    </context>

</generatorConfiguration>
4

2 回答 2

1

MyBatis Generator 依赖于 JDBC 驱动来进行类型解析。您可以在此处查看 SQL Server 如何进行类型映射:https ://docs.microsoft.com/en-us/sql/connect/jdbc/using-basic-data-types?view=sql-server-ver15

根据那个页面,DATETIMEOFFSET被映射到一个非标准的 JDBC 类型microsoft.sql.Types.DATETIMEOFFSET。生成器对该类型一无所知(MyBatis 本身也不知道)。这就是生成器将列解析为Object.

如果要DATETIMEOFFSET在 SQL Server 中使用列,则可以在生成器中使用覆盖将 Java 类型映射到microsoft.sql.DateTimeOffset. 您还需要编写一个类型处理程序,以便 MyBatis 可以使用这种类型。

不幸的是,SQL Server 似乎没有直接映射到TIMESTAMP_WITH_TIMEZONE.

于 2021-07-29T11:05:16.217 回答
0

还有另一种方法。

建议 Mybatis 使用 Instant

     <table tableName="Users" domainObjectName="User" mapperName="UserBaseMapper">
        <property name="rootInterface" value=""/>
        <generatedKey column="UserId" identity="true" sqlStatement="JDBC"/>
        <columnOverride column="Created" jdbcType="TIMESTAMP_WITH_TIMEZONE" javaType="java.time.Instant"/>
        <columnOverride column="Modified" jdbcType="TIMESTAMP_WITH_TIMEZONE" javaType="java.time.Instant"/>
    </table>

也许(也许)JDBC 类型是多余的,但它该死的在 SQL Server 和 H2 DB 上都有效,其中 H2TIMESTAMP WITH TIME ZONE用作列类型

于 2021-07-29T15:26:13.403 回答