检索 sql 日期并存储在需要 localDate 的 java 对象中

Retrieve sql date and store in java object which expects localDate

我必须从 oracle 数据库中检索日期并将其作为 localDate 存储到 java 对象中。这是我试过的代码:

public Sample findSampleById(Integer sampleId) {
    // TODO Auto-generated method stub
    PreparedStatement pStmt = null;
    ResultSet rs = null;
    Sample sample = new Sample();
    String sql = "select * from sample where sampleid =" + sampleId;
    
    try {
        pStmt = getConnection().prepareStatement(sql);
        rs = pStmt.executeQuery();
        while(rs.next()) {
            sample.setSampleId(rs.getInt("sampleid"));
            sample.setSampleKindId(rs.getInt("samplekindid"));
            sample.setExpirationDate(rs.getDate("expirationdate").toInstant().atZone(ZoneId.systemDefault()).toLocalDate());

        }
        
    } catch (SQLException e) {
        throw new DataException(e);
    }
    
    
    return sample;
}

而不是这个 sample.setExpirationDate(rs.getDate("expirationdate").toInstant().atZone(ZoneId.systemDefault()).toLocalDate());

这个我也试过了

java.sql.Date retrieved = java.sql.Date.valueOf(rs.getString("expirationDate")); sample.setExpirationDate(retrieved.Date());

示例是一个 class,具有 int sampleId、int sampleKindId 和 LocalDate expirationDate

我对该方法的 JUnit 测试在我要求到期日期的行中告诉我它抛出异常。转换有什么问题吗?

方法 getDate,在接口 java.sql.ResultSet 中,returns java.sql.Date 的一个实例。

您只需要对方法 getDate 返回的值调用方法 toLocalDate

我没有您的数据库,所以我只是尝试从 Oracle 的 DUAL 数据库 table 中选择 SYSDATE。以下代码运行良好。

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.time.LocalDate;

public class JdbcTest {

    public static void main(String[] args) {
        String url = "jdbc:oracle:thin:..."; // Replace with your appropriate URL
        try (Connection conn = DriverManager.getConnection(url);
             Statement s = conn.createStatement();
             ResultSet rs = s.executeQuery("select sysdate from dual")) {
            if (rs.next()) {
                Date sysdate = rs.getDate(1);
                LocalDate ld = sysdate.toLocalDate();
                System.out.println("LocalDate: " + ld);
                System.out.println("  sysdate: " + sysdate);
            }
        }
        catch (Exception x) {
            x.printStackTrace();
        }
    }
}

参考