检索 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();
}
}
}
参考
我必须从 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();
}
}
}
参考