我有以下查询:
@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.<init>()
答案 0 :(得分:1)
我建议您在查询中使用limit X, Y
。 select * 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对象。
sqlSession上的Mybatis select方法有一个Rowbounds属性。根据您的需要填充此内容,它将仅为您提供这些记录。在这里,你限制了mybatis方面的记录数量,而在第一种方法中,同样是在db方面进行的,这是更好的性能。
Mybatis将控制实际的jdbc结果集。因此,您可以在此处逐个执行/迭代结果。 有关详细信息,请参阅this blog entry。