Jdbi: قائمة ملزمة<integer>أو قائمة<long>باستخدام @ ربط التعليق التوضيحي يطرح استثناء</long></integer>

تم إنشاؤها على ٢٧ ديسمبر ٢٠١٧  ·  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 إخوانه ، هذا من الدرجة الأولى ، شكرا جزيلا لك!

: +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 أثناء تواجدنا فيه).
  • تجسيد قسم دليل المطور لصفائف SQL .
  • قم بتوفير رسائل خطأ إعلامية عندما يلزم تسجيل نوع مصفوفة SQL.

إذا كنت تفضل إرسال مشكلة منفصلة تستهدف كل مما سبق. ثم يمكننا إغلاق هذا واحد وتتبع كل واحد على حدة.

وإذا كانت لديك فكرة لتحسين Jdbi التي ترغب في العمل بها ، فيرجى القيام بذلك! كانت إضافات JPA و Kotlin و Vavr ، بالإضافة إلى العديد من عناصر Core و SQL Object ، كلها عمليات إرسال من مستخدمي Jdbi.

qualidafial تم. # 993

شكرا! إغلاق هذه القضية لصالح # 993

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

alexcase52 picture alexcase52  ·  14تعليقات

leaumar picture leaumar  ·  13تعليقات

jeff-blaisdell picture jeff-blaisdell  ·  20تعليقات

findepi picture findepi  ·  43تعليقات

28Smiles picture 28Smiles  ·  12تعليقات