使用 sql server 从 jdbc 中的结果集中转到最后一行
Posted
技术标签:
【中文标题】使用 sql server 从 jdbc 中的结果集中转到最后一行【英文标题】:Go to last row from result set in jdbc with sql server 【发布时间】:2012-05-18 20:10:27 【问题描述】:我尝试从我的表中选择,只选择最后一行。我试过这个:
rset = s.executeQuery("select noorder from orders");
rset.last();
String noorder = rset.getString("noorder");`
rset 是结果集,s 是语句。但它会抛出异常:ResultSet 只能在正向访问`
我已经试过了:
if (rset != null)
while(rset.next())
rset.last();
我做错了吗?任何的想法?谢谢
编辑: 正如@Bhavik-Ambani 所建议的那样(感谢他),这就是答案。这是我的代码:
Statement s2 = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rset = s2.executeQuery("select noorder from orders");
rset.afterLast();
GETLASTINSERTED:
while(rset.previous())
noorder = rset.getString("noorder");
break GETLASTINSERTED;//to read only the last row
希望它会帮助另一个。 Java 摇滚!
【问题讨论】:
如果你知道你想要最后一个,为什么不按相反的顺序对查询进行排序呢?另外:如果没有明确的ORDER BY
first 和 last 就没有真正的意义(因为顺序未定义)。
@Markrotteveel 可以,但是我的方法也可以,所以我认为它没有问题,对吗?还是我的方法有弱点?
取决于数据库和 JDBC 驱动程序,您的方法可能会导致对数据库进行更多处理(例如:读取所有行)以及在数据库和 JDBC 驱动程序之间发送更多数据(例如:发送所有行)。
【参考方案1】:
默认的 ResultSet 对象是不可更新的,并且有一个只能向前移动的光标。因此,您只能遍历它一次,并且只能从第一行到最后一行。
在代码级别,您可以执行以下操作
Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet resultSet = statement.executeQuery("select noorder from orders");
resultSet.afterLast();
while (resultSet.previous())
String productCode = resultSet.getString("col_one");
String productName = resultSet.getString("col_two");
connection.close();
【讨论】:
在while()循环中,是只取一行,还是向后取所有行? 它会从最后一条记录到后面的记录。如果您不想向后迭代,您可以放置 if 条件并获取最后一条记录值。【参考方案2】:isLast()
应该是您要查找的内容。
ResultSet rs = stmt.executeQuery(query);
while(rs.next())
if(rs.isLast())
// is last row in ResultSet
【讨论】:
【参考方案3】:记得应用order by
子句,否则ResultSet
中的最后一个条目可能不是您所期望的。
【讨论】:
【参考方案4】:您可以使用:
connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
【讨论】:
【参考方案5】:rset = s.executeQuery("SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1");
String noorder = rset.getString("noorder");`
【讨论】:
my unique_column 是一个带有一组数据的字符串,例如 '12-05-0001/E ,12 代表年份,05 代表月份,0001 代表数字。我不认为你的方法可以工作,因为它试图订购列。我认为我的专栏不会正确排序。但感谢您的帮助。它仅在列可排序时才有效,如通常的字符串或整数..以上是关于使用 sql server 从 jdbc 中的结果集中转到最后一行的主要内容,如果未能解决你的问题,请参考以下文章
从 Camel 和 Spring Boot 到 MS SQL Server 的 JDBC
使用 SQL Server 上的 JDBC Sink 连接器自动创建适当的 DATETIME 类型字段