1

もともと、空のテストとして結果セットで(seq)を呼び出すのに問題があるのはなぜかと尋ねるつもりでしたが、少し調べてみると、jdbcカーソルがどこにも移動していないことが原因と思われます。上品でダンディ。名前がわからない場合、結果セットでnext()を呼び出す方法はありますか?clojureのシンボルにバインドすることはできますが、そこからメソッドを呼び出す方法がわかりません。

編集:明確でない場合は、clojure(next)ではなくjava resultSetメソッドnext()を参照しています

edit#2ここにコードスニペットがあります:

(defn user-exists? [email]
  (with-connection db
   (with-query-results res ["SELECT guid from users WHERE email=?" email]
    (.next res)
    (seq res))))

(.nextのヘルプに感謝します、ところで...まだ多くのJava相互運用機能を実行していません)

それでも、クエリが何も返さなかった場合、(seq)を使用するとNullPointerExceptionがスローされます。これを行うためのよりクリーンで慣用的な方法があるかどうか疑問に思っていますか?

4

2 に答える 2

3

resは、ResultSetに基づいてClojureシーケンスにバインドされます。ここで、各項目は、キーのキーワードとして出力列名を持つ結果レコードのマップです。基になる実際のResultSetオブジェクトに到達することはできません。

通常、次に電話をかけることはありません。慣用的なClojureであるためには、シーケンス(マップ、フィルター、リデュースなど)を操作する関数の膨大なライブラリーを利用して出力を生成します。ここであなたは次のようなことを言うかもしれません:

(with-query-results res ["SELECT guid from users WHERE email=?" email]
  (map :guid res))

これは、:guidをres seqeuenceの関数として適用し、各レコードのguidの列値を取得して、すべてのguidの新しいシーケンスを返します。次に、そのマップをフィルターまたはその他の必要なものでラップできます。

この場合、seqあなたが望むものでなければなりませんが、抽象化が少し漏れていると思います。試してみると、java.sql.SQLRecoverableException:Closed Resultset:nextが表示されました。これは、抽象化の早い段階でResultSetが閉じられていることを意味します。empty?ただし、このユースケースでは問題なく機能する ことがわかりました。

(defn user-exists? [email]
  (with-connection db
   (with-query-results res ["SELECT guid from users WHERE email=?" email]
    (.next res)
    (not (empty? res)))))

これは私にはclojure.core/resultset-seqのバグのようで、ここではCLJ-676として報告しました。

于 2010-11-16T21:43:55.877 に答える
1

どうですか

(defn user-exists? [email]
  (with-connection db
    (with-query-results res ["SELECT guid from users WHERE email=?" email]
      (first res))))

行が返される場合、または一致する行がない場合は、何かが返されるはずです。nil

resを呼び出す値であるため、以前のクエリは失敗していました(resultset-seq x)。そのため、Javaを使用することResultSet.next()も、再度呼び出すこともできませんseq

前述のように、 (および)が開いているresultset-seq間を評価する必要があるため、ResultSetConnection

(defn users-with-email [email]
  (with-connection db
    (with-query-results res ["SELECT guid from users WHERE email=?" email]
      (doall res))))
于 2010-11-19T21:46:20.410 に答える