Java ResultSet 除了 sql 在 mysql 中得到结果之外什么也得不到
Java ResultSet get nothing but sql get result in mysql
我正在使用 MySql 数据库,其中有一个 table 'tradeinfo'。
Table结构:
Date TradeCode
2017.01.01 0001
2017.02.05 0002
2017.03.05 0001
我 sql 找到一个交易代码的最后交易日是
SELECT TradeCode, MAX(date) most_recent_time FROM tradeinfo WHERE TradeCode = '0001'
我在 Mysql 数据库中测试了 sql 并且可以得到正确的结果,即“2017.03.05 0001”
但是对于我的 java 代码 "lastestdbrecordsdate = rs.getDate("MOST_RECENT_TIME"); ",它曾经 return 正确的结果。但是几天后,当再次 运行 时,我总是得到 NULL。
我的 java 代码是:
Connection con = DriverManager.getConnection("jdbc:mysql://...",user,password);
String sqlstatement = "SELECT TradeCode, MAX(date) most_recent_time FROM tradeinfo WHERE TradeCode = '0001' ";
PreparedStatement sqlstat = con.prepareStatement(sqlstatement);
ResultSet rsquery = sqlstat.executeQuery(sqlstatement);
CachedRowSetImpl cachedRS = new CachedRowSetImpl();
cachedRS.populate(rsquery);
while(cachedRS.next() ) {
System.out.println(cachedRS.getMetaData().getColumnCount());
Date lastestdbrecordsdate = cachedRS.getDate("MOST_RECENT_TIME");
}
是我mysql设置错误还是我java代码写错了?
谢谢大家!
你这里有几个问题。首先,您应该使用以下查询:
SELECT MAX(date) most_recent_time FROM tradeinfo WHERE TradeCode = '0001'
将 TradeCode
添加到 select 列表没有任何意义,因为它不是聚合,而是每条记录都有该列的值。
关于为什么得到空结果,需要调用ResultSet#next()
将光标移到第一行:
Connection con = DriverManager.getConnection("jdbc:mysql://...", user, password);
Statement sqlstat = con.prepareStatement(sqlstatement);
ResultSet rsquery = sqlstat.executeQuery(); // DON'T pass anything to executeQuery()
if (rsquery.next()) {
Date lastestdbrecordsdate = rs.getDate("most_recent_time");
}
我刚刚注意到的另一个问题是您将查询字符串传递给对 Statement#executeQuery()
的调用。这是错误的,你不应该将任何东西传递给这个方法。
我正在使用 MySql 数据库,其中有一个 table 'tradeinfo'。 Table结构:
Date TradeCode
2017.01.01 0001
2017.02.05 0002
2017.03.05 0001
我 sql 找到一个交易代码的最后交易日是
SELECT TradeCode, MAX(date) most_recent_time FROM tradeinfo WHERE TradeCode = '0001'
我在 Mysql 数据库中测试了 sql 并且可以得到正确的结果,即“2017.03.05 0001” 但是对于我的 java 代码 "lastestdbrecordsdate = rs.getDate("MOST_RECENT_TIME"); ",它曾经 return 正确的结果。但是几天后,当再次 运行 时,我总是得到 NULL。 我的 java 代码是:
Connection con = DriverManager.getConnection("jdbc:mysql://...",user,password);
String sqlstatement = "SELECT TradeCode, MAX(date) most_recent_time FROM tradeinfo WHERE TradeCode = '0001' ";
PreparedStatement sqlstat = con.prepareStatement(sqlstatement);
ResultSet rsquery = sqlstat.executeQuery(sqlstatement);
CachedRowSetImpl cachedRS = new CachedRowSetImpl();
cachedRS.populate(rsquery);
while(cachedRS.next() ) {
System.out.println(cachedRS.getMetaData().getColumnCount());
Date lastestdbrecordsdate = cachedRS.getDate("MOST_RECENT_TIME");
}
是我mysql设置错误还是我java代码写错了? 谢谢大家!
你这里有几个问题。首先,您应该使用以下查询:
SELECT MAX(date) most_recent_time FROM tradeinfo WHERE TradeCode = '0001'
将 TradeCode
添加到 select 列表没有任何意义,因为它不是聚合,而是每条记录都有该列的值。
关于为什么得到空结果,需要调用ResultSet#next()
将光标移到第一行:
Connection con = DriverManager.getConnection("jdbc:mysql://...", user, password);
Statement sqlstat = con.prepareStatement(sqlstatement);
ResultSet rsquery = sqlstat.executeQuery(); // DON'T pass anything to executeQuery()
if (rsquery.next()) {
Date lastestdbrecordsdate = rs.getDate("most_recent_time");
}
我刚刚注意到的另一个问题是您将查询字符串传递给对 Statement#executeQuery()
的调用。这是错误的,你不应该将任何东西传递给这个方法。