完全に理解していないイテレータで奇妙な問題が発生しています。イテレータはloggedPreparedStatementで使用されていますが、時々(200のうち約20)がこのエラーをスローします:
SQLException in executeQuery, errorcode: 0, SQL state: 07001, message: No value specified for parameter 1
while executing statement: com.mysql.jdbc.PreparedStatement@11fffa73: SELECT ac.id as i FROM ac LEFT JOIN pa ON pa.id = ac.adspace_id WHERE pa.adspace_id IN (** NOT SPECIFIED **)
これは、イテレータを作成する方法です。
private Iterator< Integer > adspacesId = null;
public ArrayList<Integer> getIds(int inAdspaceId) {
if (inAdspaceId <= 0) return new ArrayList<Integer>();
ArrayList<Integer> tempList = new ArrayList<Integer>();
tempList.add(new Integer(inAdspaceId));
adspacesId = tempList.listIterator();
num = tempList.size();
activeOnly = false;
if (adspacesId != null && adspacesId.hasNext() && num > 0) {
executeQuery();
}
return result;
}
したがって、一時的な arrayList に int を追加し、それを Iterator に変換してから、クエリでその iterator を次のように使用します。
LoggedPreparedStatement statement = new LoggedPreparedStatement(theQuery.toString());
statement.setInt(1, adspacesId);
したがって、私の最初の推測では、イテレータにエントリはありませんが、adspacesId.hasNext() のチェックにどのように合格するのでしょうか?
num の値は 1 であるため、templist にエントリがあり、イテレータで想定します。
少しの助けは大歓迎です:)