2017-06-01 455 views
0

下面的代码是我接触到的后端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; 
} 

回答

3

退房的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的构造函数,它会被解释为现在

+0

谢谢大家的参考材料! – Dan

1
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对象。
否则,请不要使用它,并将nullDateTime字段的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); 
} 
+0

这非常有帮助!非常感谢你帮助我理解问题。 – Dan

+0

@丹非常欢迎:) – davidxxx

相关问题