やあ、
まず第一に、この素晴らしい図書館に感謝します。
私が経験しているエラーは次のとおりです。
空のリストをバインドする
タイプjava.util.Listの '[]'に登録された引数ファクトリはありません
より多くのコンテキストを提供できますか? どの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
)。上記のそれぞれを対象とした個別の問題を提出していただければ幸いです。 次に、これを閉じて、それぞれを個別に追跡できます。
そして、一緒に実行したいJdbiを改善するためのアイデアがあれば、ぜひ実行してください。 JPA、Kotlin、Vavrプラグイン、およびCoreとSQL Objectの多くの要素は、すべてJdbiユーザーからの提出物でした。
@qualidafialが完了しました。 #993
ありがとう! #993を支持してこの問題を閉じる
最も参考になるコメント
さて、それは今では理にかなっています。
配列を操作する場合、JDBCは少し奇妙です。データベースベンダーが使用するデータ型名を知っている必要があります。 Jdbiがドットを接続できるようにするには、Javaクラス名ごとに配列要素の型名を登録する必要があります。