Java JDBC RowMapper:将MSSQL Server datetimeoffset转换为Java OffsetDateTime

Java JDBC RowMapper : Convert MSSQL Server datetimeoffset into Java OffsetDateTime

提问人:mattsmith5 提问时间:11/11/2023 最后编辑:marc_smattsmith5 更新时间:11/14/2023 访问量:55

问:

我正在使用JDBC模板从MS SQL Server / Azure中的数据库中检索数据。我在 SQL 中的注册日期为 datetimeoffset。对应的 RowMapper / ResultSet 方法是什么,转换为 Java OffsetDateTime ?

请参阅最后一行:

SQL格式:

CREATE TABLE [dbo].[Customer]
(
    [CustomerId] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [varchar](255) NOT NULL,
    [employeeid] [int] NOT NULL,
    [EnrollmentAmount] [decimal](10, 2) NULL,
    [ActiveFlag] [bit] NULL,
    [EnrollmentDate] [datetimeoffset](7) NULL,  -- << this column
)

爪哇岛:

@Data
public class CustomerGetResponse {
    private int customerId;
    private String firstName;
    private int employeeId;
    private BigDecimal enrollmentAmount;
    private boolean activeFlag;
    private OffsetDateTime enrollmentDate;  
}

public class CustomerGetMapper implements RowMapper<CustomerGetResponse> {
    public CustomerGetResponse mapRow(ResultSet rs, int rowNum) throws SQLException {
        CustomerGetResponse customer = new CustomerGetResponse();
        customer.setCustomerId(rs.getInt("CustomerId"));
        customer.setFirstName(rs.getString("FirstName"));
        customer.setFeeAmount(rs.getBigDecimal("EnrollmentAmount"));
        customer.setActiveFlag(rs.getBoolean("ActiveFlag"));
        customer.setEnrollmentDate(rs.); -- << trying to figure out correct ResultSet method
        return customer;
    }

enter image description here

注意:BeanPropertyRowMapper.newInstance(CustomerGetResponse.class)似乎做得很好,(不确定它在内部做了什么),但尝试使用手动RowMapper。

参考问题:java.time.OffsetDateTime 的 SQL Server 数据库列类型是什么?

java sql-server spring-boot jdbc azure-sql-database

评论

0赞 siggemannen 11/11/2023
大概是这样的:.虽然我记得 ms 没有正确实现 getObject,但您可能需要将 ResutlSet 强制转换为 SQLServerResultSet 并执行以下操作:((DateTimeOffset)rs.getObject("bla", DateTimeOffset.class)).getOffsetDateTime()((SQLServerResultSet)rs).getDateTimeOffset("bla").getOffsetDateTime()
0赞 mattsmith5 11/11/2023
嗨,@siggemannen随时写作为答案,我可以发送积分,谢谢

答:

1赞 siggemannen 11/11/2023 #1

“标准”的做法是:

OffsetDateTime offset = rs.getObject(1, OffsetDateTime.class);

几种替代方法:

import microsoft.sql.DateTimeOffset;
...
DateTimeOffset dto = (DateTimeOffset) rs.getObject(1);
DateTimeOffset dto = rs.getObject(1, DateTimeOffset.class);
DateTimeOffset dto = ((SQLServerResultSet)rs).getDateTimeOffset(1);

return dto != null ? dto.getOffsetDateTime(): null; //Careful with nulls!

第一个版本是最安全的,避免了强制转换,而其他版本则使用具体的 Microsoft 实现类。

这些已使用 Microsoft JDBC 驱动程序版本 9.1.1 进行了测试,您的里程可能因旧版本而异。 另外,一般要注意时区处理,有很多陷阱以及在途中丢失信息的方式,无论是从数据库还是到数据库!