提问人:mattsmith5 提问时间:11/11/2023 最后编辑:marc_smattsmith5 更新时间:11/14/2023 访问量:55
Java JDBC RowMapper:将MSSQL Server datetimeoffset转换为Java OffsetDateTime
Java JDBC RowMapper : Convert MSSQL Server datetimeoffset into Java OffsetDateTime
问:
我正在使用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;
}
注意:BeanPropertyRowMapper.newInstance(CustomerGetResponse.class)似乎做得很好,(不确定它在内部做了什么),但尝试使用手动RowMapper。
答:
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 进行了测试,您的里程可能因旧版本而异。 另外,一般要注意时区处理,有很多陷阱以及在途中丢失信息的方式,无论是从数据库还是到数据库!
评论
((DateTimeOffset)rs.getObject("bla", DateTimeOffset.class)).getOffsetDateTime()
((SQLServerResultSet)rs).getDateTimeOffset("bla").getOffsetDateTime()