我正在我的应用程序中实现Paging。为此,我运行一个查询并获得一个ResultSet 现在我想获得此ResultSet中的总记录数,用于我的分页计算 我怎么能得到这个?我不想执行额外的SQL,它给了我总行数。
答案 0 :(得分:2)
正常练习是将ResultSet
映射到List<Entity>
,其中Entity
是表示实际数据的javabean,例如User
,Product
,Order
等
然后,您可以使用List
等List<Entity> entities = entityDAO.list();
int rows = entities.size();
if (entities.isEmpty()) {
// It is empty!
} else if (entities.size() == 1) {
// It has only one row!
} else {
// It has more than one row!
}
方法来获取行数。
{{1}}
答案 1 :(得分:2)
另一个选项是将计数聚合添加为查询中的子查询列。如果你的数据库有点聪明,它只会执行一次。您应该可以使用您喜欢的数据库中的查询分析器轻松地检查这一点。
SELECT id,username,(SELECT COUNT(id) FROM users) FROM users;
答案 2 :(得分:2)
int totalRows = 0;
try {
resultSet.last();
totalRows = resultSet.getRow();
resultSet.beforeFirst();
} catch(Exception ex) {
return 0;
}
return totalRows ;
答案 3 :(得分:1)
如果我没弄错的话,ResultSet的默认行为不是一次获取所有行,因此无法从对象本身知道在没有第一次迭代的情况下将从查询返回多少行(并因此检索所有这些。对于特定数据库,您可能会使用特定JDBC驱动程序获得不同的行为。
请问为什么首先运行COUNT()查询的成本太高?与检索实际值的成本相比,它不应该太昂贵。
答案 4 :(得分:1)
从评论到BalusC's回答:
[...]实际上我不想获取集合中的所有行,因为我想在页面上只显示10行,因此我的分页计算帮助我从结果集中只获得10行。为此,我需要在结果集中没有行
除了向数据库询问大约10行和表的大小之外,您只需要其他内容。所以你实际上有两(2)个问题到你的数据存储,这相当于两(2)个选择查询。按Uri建议做,不关心'最佳实践'。如果有一天有人带来更好的练习,你仍然可以决定是否调整你的代码。
答案 5 :(得分:0)
计算List大小以获取记录计数没有意义,因为我们正在实现分页,并且不应该一次加载整个结果集。
我在数据库级别使用ROW_NUM来实现分页逻辑。我们需要获取尽可能多的记录,以便在屏幕上显示它。
示例:从Emp中选择*,其中rownum&gt; =:beginRecord和rownum&lt; =:endRecord
逻辑将是相同的,但语法可能会根据数据库的类型而改变。如果我们需要按任何列进行排序,则需要使用嵌套查询。
我相信,count(*)是昂贵的操作,而我更喜欢分区。
从Emp中选择Eno,Ename,(从emp中选择计数(*))作为record_count - 昂贵 选择Eno,Ename,count(*)over(partition by eno)作为来自Emp的record_count - 首选。
语法分区可能会因数据库类型而异。
我考虑过Oracle数据库。
随意发表评论/讨论。
谢谢&amp;问候, Lokesh Rangineni。
答案 6 :(得分:-1)
除了Fathah解决方案,您可以使用此代码,还要注意,因为它的内存指针这个解决方案没有性能问题:
int totalRows = 0;
if(rowSet.last()) {
totalRows = rowSet.getRow();
}
rowSet.beforeFirst();