Jdbi: バインディングリスト<integer>またはリスト<long>@Bindアノテーションを使用すると例外がスローされます</long></integer>

作成日 2017年12月27日  ·  16コメント  ·  ソース: jdbi/jdbi

やあ、

まず第一に、この素​​晴らしい図書館に感謝します。
私が経験しているエラーは次のとおりです。

空のリストをバインドするまたはリスト@Bindアノテーションを使用すると、

タイプjava.util.Listの '[]'に登録された引数ファクトリはありません

question

最も参考になるコメント

さて、それは今では理にかなっています。

配列を操作する場合、JDBCは少し奇妙です。データベースベンダーが使用するデータ型名を知っている必要があります。 Jdbiがドットを接続できるようにするには、Javaクラス名ごとに配列要素の型名を登録する必要があります。

Jdbi jdbi = Jdbi.create(...);
...
jdbi.registerArrayType(int.class, "integer");
jdbi.registerArrayType(Integer.class, "integer");

全てのコメント16件

より多くのコンテキストを提供できますか? どのSQLを実行していますか? どのデータベースベンダーですか?

こんにちは@qualidafial

SQL: select * from invoice where invoice.id IN :ids
データベースベンダー:SQL Server 2017

さて、それは今では理にかなっています。

配列を操作する場合、JDBCは少し奇妙です。データベースベンダーが使用するデータ型名を知っている必要があります。 Jdbiがドットを接続できるようにするには、Javaクラス名ごとに配列要素の型名を登録する必要があります。

Jdbi jdbi = Jdbi.create(...);
...
jdbi.registerArrayType(int.class, "integer");
jdbi.registerArrayType(Integer.class, "integer");

そうは言っても、例外メッセージを改善して、ユーザーを正しい方向に向けることができます。

@qualidafial Bro、これは一流です、どうもありがとうございました!

:+1:ちょっと注意してください。いくつかのドキュメントを教えていただければ、SQL ServerプラグインをJdbiに追加できます。これにより、ドライバーがサポートするカスタムデータ型と、JavaタイプとJDBCデータタイプの間のマッピングがわかります。名前。

@qualidafial FYI、明らかに、準備されたSqlArrayを含むINステートメントはSQL ServerJDBCドライバーではサポートされていません

または、 @BindList使用することもできます。

@SqlQuery("select * from invoice where invoice.id IN (<ids>)")
Set<Invoice> getInvoices(@BindList("ids") List<Integer> ids);

データベースベンダーが異なれば、カンマで区切られたWHERE column IN (a, b, c, ...)句で許可される項目の数に制限を設ける場合があることに注意してください。

どうやらSQLサーバーは単一値パラメーターのみをサポートしているので、手動で配列を作成しましたが、これは文字列配列には安全ではなく、SQLインジェクションを導入する可能性があります。

default List<LotInvoiceRef> getInvoices(List<Long> invoiceIds) {

        final List<LotInvoiceRef> lotInvoiceRefs = invoiceIds.stream()
                .map(String::valueOf)
                .reduce((a, b) -> a + "," + b)
                .map(this::getAllInvoiceRefs)
                .orElse(new ArrayList<>());

        return lotInvoiceRefs;

    }

@georgerb私の最後のコメントをご覧ください。SQLインジェクションから保護する必要があります

私は@BindListのaproachを愛するが、私は明示的には禁止を@BindListパラメータの空のリストをできるようにする方法が必要です@qualidafial。

@qualidafial nvm、アノテーションを簡単に調べて、これを使用しました: @BindList(value = "invoiceIds", onEmpty = BindList.EmptyHandling.NULL)そしてそれは完全に機能しました

繰り返しますが、これは一流です。 私たちが貢献できる方法はありますか? 少なくともドキュメントを手伝ってくれます。

ありがとう、あなたはとても親切です。 私たち:ハート:プルリクエスト!

この会話だけから、3つの可能な改善点を収集します。

  • @BindList開発者ガイドセクションを追加します(そして、私たちがそこにいる間はおそらく@DefineList )。
  • SQL配列の開発者ガイドセクションを
  • SQL配列タイプを登録する必要がある場合は、有益なエラーメッセージを提供します。

上記のそれぞれを対象とした個別の問題を提出していただければ幸いです。 次に、これを閉じて、それぞれを個別に追跡できます。

そして、一緒に実行したいJdbiを改善するためのアイデアがあれば、ぜひ実行してください。 JPA、Kotlin、Vavrプラグイン、およびCoreとSQL Objectの多くの要素は、すべてJdbiユーザーからの提出物でした。

@qualidafialが完了しました。 #993

ありがとう! #993を支持してこの問題を閉じる

このページは役に立ちましたか?
0 / 5 - 0 評価