有没有办法让查询返回ResultSet?

时间:2015-05-08 16:57:59

标签: java mybatis

我有以下查询:

@Select("SELECT* FROM "+MyData.TABLE_NAME+" where data_date = #{refDate}")
public List<MyData> getMyData(@Param("refDate") Date refDate);

此表数据非常大!在内存中加载这么多行并不是最好的方法! 是否可以让同一个查询返回一个结果集,以便我可以迭代一个项目?

编辑: 我尝试添加:

@ResultType(java.sql.ResultSet.class)
public ResultSet getMyData(@Param("refDate") Date refDate);

但它给了我:

nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating interface java.sql.ResultSet with invalid types () or values (). Cause: java.lang.NoSuchMethodException: java.sql.ResultSet.&lt;init>()

2 个答案:

答案 0 :(得分:1)

我建议您在查询中使用limit X, Yselect * from table where id>0 limit 100语法对你有好处。试试吧。

如果表格很大,查询将变得越来越慢。然后迭代的最佳方法是根据id和使用限制进行过滤。

等等 select * from table where id>100 limit 100然后 {{1}}等

答案 1 :(得分:1)

你有多种选择......

  • 在数据库端使用分页

我只想假设数据库是oracle。但是其他数据库供应商也会工作。在oracle中,你有一个rownum,你可以用它来限制返回的记录数。要返回所需数量的记录,您需要使用此rownum准备where子句。现在,问题是如何在查询中提供动态rownum。这是动态sqls的mybatis正在使用的地方。您可以在参数映射中传递这些rownum值,您可以在映射器xml中使用#{}语法在查询中使用这些值。使用此方法,您可以过滤db级别本身的记录,并仅提供或准备所需的或当前页面中的java对象。

  • 在mybatis端使用分页

sqlSession上的Mybatis select方法有一个Rowbounds属性。根据您的需要填充此内容,它将仅为您提供这些记录。在这里,你限制了mybatis方面的记录数量,而在第一种方法中,同样是在db方面进行的,这是更好的性能。

  • 使用结果处理程序

Mybatis将控制实际的jdbc结果集。因此,您可以在此处逐个执行/迭代结果。 有关详细信息,请参阅this blog entry