أهلا،
بادئ ذي بدء ، شكراً لك على هذه المكتبة الرائعة.
الخطأ الذي أواجهه هو ما يلي:
ربط قائمة فارغة
لم يتم تسجيل مصنع وسيطة لـ "[]" من النوع 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 إخوانه ، هذا من الدرجة الأولى ، شكرا جزيلا لك!
: +1: فقط تنبيه ، يمكننا إضافة مكون إضافي لـ SQL Server إلى Jdbi إذا كان بإمكانك توجيهي إلى بعض الوثائق حتى أعرف أنواع البيانات المخصصة التي يدعمها برنامج التشغيل ، وما هي التعيينات بين أنواع Java ونوع بيانات JDBC الأسماء.
صفقة.
أنواع البيانات الأساسية:
https://docs.microsoft.com/en-us/sql/connect/jdbc/using-basic-data-types
أنواع البيانات المتقدمة:
https://docs.microsoft.com/en-us/sql/connect/jdbc/using-advanced-data-types
qualidafial FYI ، يبدو أن عبارة IN مع SqlArray المعدة غير معتمدة من قبل برنامج تشغيل SQL Server JDBC
يمكنك بدلاً من ذلك استخدام @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 يدعم فقط معلمات القيمة الفردية ، لذلك قمت بإنشاء المصفوفة يدويًا ، ولكن هذا غير آمن لمصفوفات String ويمكنه تقديم SQL Injection.
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
qualidafial أنا أحب BindList aproach لكني أحتاج إلى طريقة للسماح بالقوائم الفارغة للمعامل الذي يحظر
qualidafial nvm ، بحث سريع في التعليق التوضيحي واستخدمت هذا: @BindList(value = "invoiceIds", onEmpty = BindList.EmptyHandling.NULL)
وقد نجح ذلك على أكمل وجه
مرة أخرى ، هذا من الدرجة الأولى. هل هناك طريقة يمكننا من خلالها المساهمة؟ على الأقل مساعدتكم في الوثائق.
شكرا، انت لطيف جدا. نحن: القلب: سحب الطلبات!
من هذه المحادثة وحدها ، أجمع ثلاثة تحسينات ممكنة:
@BindList
(وربما @DefineList
أثناء تواجدنا فيه).إذا كنت تفضل إرسال مشكلة منفصلة تستهدف كل مما سبق. ثم يمكننا إغلاق هذا واحد وتتبع كل واحد على حدة.
وإذا كانت لديك فكرة لتحسين Jdbi التي ترغب في العمل بها ، فيرجى القيام بذلك! كانت إضافات JPA و Kotlin و Vavr ، بالإضافة إلى العديد من عناصر Core و SQL Object ، كلها عمليات إرسال من مستخدمي Jdbi.
qualidafial تم. # 993
شكرا! إغلاق هذه القضية لصالح # 993
التعليق الأكثر فائدة
حسنًا ، هذا منطقي الآن.
JDBC غريب بعض الشيء عند العمل مع المصفوفات - عليك أن تعرف اسم نوع البيانات الذي يستخدمه بائع قاعدة البيانات. لمساعدة Jdbi على توصيل النقاط ، يجب عليك تسجيل اسم نوع عنصر المصفوفة لكل اسم فئة Java: