package org.nutz.dao.impl.sql.pojo; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import org.nutz.dao.entity.Entity; import org.nutz.dao.pager.ResultSetLooping; import org.nutz.dao.sql.Pojo; import org.nutz.dao.sql.PojoCallback; import org.nutz.dao.sql.SqlContext; import org.nutz.lang.ContinueLoop; import org.nutz.lang.Each; import org.nutz.lang.ExitLoop; import org.nutz.lang.Lang; import org.nutz.lang.Loop; import org.nutz.lang.LoopException; public class PojoEachEntityCallback implements PojoCallback { @SuppressWarnings("unchecked") public Object invoke(Connection conn, ResultSet rs, Pojo pojo) throws SQLException { // 得到回调 final Each<Object> each = pojo.getContext().attr(Each.class); // 没有回调,什么都不用执行了 if (null == each) return null; // 开始执行 final Entity<?> en = pojo.getEntity(); ResultSetLooping ing = new ResultSetLooping() { protected boolean createObject(int index, ResultSet rs, SqlContext context, int rowCount) { Object obj = en.getObject(rs, context.getFieldMatcher()); try { each.invoke(index, obj, rowCount); } catch (ContinueLoop e) {} catch (LoopException e) { throw Lang.wrapThrow(e); } return false; } }; try { // 循环开始 if (each instanceof Loop) if (!((Loop<?>) each).begin()) return 0; // 循环中 ing.doLoop(rs, pojo.getContext()); // 循环结束 if (each instanceof Loop) ((Loop<?>) each).end(); } catch (ExitLoop e) {} catch (LoopException e) { SQLException e2 = new SQLException(); e2.initCause(e.getCause()); throw e2; } // 返回数量 return ing.getIndex() + 1; } }