如何判断Postgres在Java中的时间戳是否为空
下面的代码是我接触到的后端REST服务的代码片段。我想知道如何判断我得到的时间戳是否为空。我通过试验和错误了解到,如果Postgres数据库中的时间戳为空,那么当我将它带入Java时,如果它的null值将在当前操作时被实例化为新的DateTime。我能做些什么来根据模型数据动态获取和设置空值?如何判断Postgres在Java中的时间戳是否为空
public List<SubscriptionEntityModel> getAllSubscriptions(PagingInfoDomainModel paging) throws Exception {
Database db = new Database();
String stmt = "{call sp_subscriptions_get_all(?, ?)}";
if(AppConfig.data.isDebug) {
logger.debug("Running database operation.. " + stmt);
}
CallableStatement sproc = db.dbEndpoint.prepareCall(stmt);
sproc.setInt(1, paging.pageCurrent);
sproc.setInt(2, paging.pageItemCount);
ResultSet rs = sproc.executeQuery();
List<SubscriptionEntityModel> subscriptions = new ArrayList<SubscriptionEntityModel>();
while(rs.next()) {
SubscriptionEntityModel subscription = new SubscriptionEntityModel();
subscription.subscriptionId = rs.getInt("subscription_id");
subscription.name = rs.getString("name");
subscription.emailAddress = rs.getString("email_address");
subscription.phoneNumber = rs.getString("phone_number");
subscription.organizationId = rs.getInt("organization_id");
subscription.createdAt = new DateTime(rs.getTimestamp("created_at"));
subscription.expiredAt = new DateTime(rs.getTimestamp("expired_at"));
subscriptions.add(subscription);
}
sproc.close();
db.destroy();
return subscriptions;
}
退房的ResultSet#wasNull最后一列读
https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#wasNull()
报告是否为SQL NULL值。
因此,你可以用它rs.getTimestamp()
后检查读取的值是否为SQL NULL,但要注意的ResultSet#getTimestamp已经返回空引用,如果是这样的话。
https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getTimestamp(int)
列值;如果该值为SQL NULL,则返回值为null
你面临的问题是,当你传递一个空引用的DateTime的构造函数,它会被解释为现在。
java.sql.Timestamp getTimestamp(String columnLabel) throws SQLException;
将返回null
如果SQL领域是NULL
。
问题是你实例化DateTime
对象的方式。
随着JodaTime(我举这个例子,你不指定使用的库),执行以下代码确实创建一个DateTime
实例与实际日期时间:
java.sql.Timestamp timestamp = null;
DateTime dateTime = new DateTime(timestamp);
所以要解决你的问题,你有什么可以做的是检查结果集返回的值。
如果不是null
,请使用它创建DateTime
对象。
否则,请不要使用它,并将null
DateTime
字段的SubscriptionEntityModel
字段设置为属性。
所以不是这样做的:
subscription.createdAt = new DateTime(rs.getTimestamp("created_at"));
你应该这样做:
java.sql.Timestamp createdAt = rs.getTimestamp("created_at");
if (createdAt != null){
subscription.expiredAt = new DateTime(createdAt);
}
谢谢大家的参考材料! – Dan