使用 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

如何从jdbc连接中的方法返回结果集

通过 JDBC 检索 SQL Server 查询统计信息

使用 SQL Server 上的 JDBC Sink 连接器自动创建适当的 DATETIME 类型字段

使用JDBC连接android到SQL Server的正确方法

使用 Sql Server 2016 的 OPENJSON 函数从 Json 文档中的多个数组元素中选择结果