0

完全に理解していないイテレータで奇妙な問題が発生しています。イテレータは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 にエントリがあり、イテレータで想定します。

少しの助けは大歓迎です:)

4

1 に答える 1

0
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

Iterator<Integer> it = list.listIterator();

System.out.println("First Element : " + it.next());

最初の要素でも要素を取得するには、next()を呼び出す必要があると思います。私はあなたがここでやったとは思わない。そして、それがPreparedStatementの場合、 executeQuery()を実行する前にパラメーターを追加した場所がわかりません。そして、ここではIteratorの代わりにListIteratorインターフェイスを使用することをお勧めします..

于 2013-07-15T09:32:08.330 に答える