Jdbi: لا يمكن استخدام الخريطة<string object="">داخل "استعلام كائن SQL"</string>

تم إنشاؤها على ٣١ أغسطس ٢٠١٦  ·  10تعليقات  ·  مصدر: jdbi/jdbi

عند العودة نوع الخريطةأو قائمة> يؤدي إلى فشل يقول أنه لا توجد نتيجة تعيين معين للنوع 'java.util.Map'. أعلم أن "استعلام كائن SQL" (http://jdbi.org/sql_object_api_queries/) مخصص لإرجاع الكائنات ، ولكن سيكون من الجيد أن تكون قادرًا على إرجاع هذا النوع عندما لا تريد التحديد والعنصر والنتيجة تعيين مخطط وهو مفيد في بعض السيناريوهات. (على سبيل المثال عند إجراء استعلام ارتباط معقد).

لقد تمكنت من التغلب على المشكلة من خلال توفير مخطط للنوع "java.util.Map" باستخدام الكود أدناه.

<strong i="9">@Override</strong>
    public Map<String, Object> map(int index, ResultSet r, StatementContext ctx) throws SQLException {
        Map<String, Object> rs = new HashMap<>();

        ResultSetMetaData metaData = r.getMetaData();

        for (int i = 1; i <= metaData.getColumnCount(); i++) {
            rs.put(metaData.getColumnName(i), r.getObject(i));
        }

        return rs;
    }

ولكن سيكون من الرائع أن يتم تضمين هذا كمعيار.

ملاحظة. إذا كان أي شخص يعرف طريقة _proper_ للقيام بـ SQL ينضم بسهولة إلى JDBI دون الحاجة إلى تحديد كائنات معقدة متعددة لكل صلة (أو كائن لكل مجموعة بيانات تريدها) ، فأخبرني بذلك .. AFAIK تحويل ResultSet إلى خريطةهي أسهل طريقة.

التعليق الأكثر فائدة

يبدو أننا ندعم ذلك من خلال تسجيل DefaultMapper في jdbi3 ، كما نوفر الآن إمكانية الانضمام بسهولة عبر JoinRowMapper و RowView مما يجعل استرداد النتائج أفضل بكثير. أعتقد أنه لم يتبق شيء في هذه المشكلة إذن - لن نعود إلى الإصدار 2 ، آسف.

أخبرنا إذا لم يحل هذا مشكلتك!

ال 10 كومينتر

لذلك إذا كنت تستخدم واجهة برمجة التطبيقات (API) بطلاقة (على سبيل المثال ، استخدام المقبض لإنشاء استعلامات
وربط الوسيطات بشكل إلزامي) ، يقوم مخطط الخرائط الافتراضي بتعيين
خريطةكما في مثالك.

يبدو أننا قد أغفلنا هذه الحالة بالنسبة لكائنات SQL. سأرسل مشكلة
من أجل هذا.

الحل السهل هو تنفيذ طريقة SQL الخاصة بك كطريقة ملموسة:

قائمة عامة> doQuery (String arg0، int arg1) {
إرجاع getHandle (). createQuery ("حدد * من foo حيث arg0 =: arg0
و arg1 =: arg1 ")
.bind ("arg0"، ​​arg0)
.bind ("arg1"، arg1)
.قائمة()؛
}

يوم الأربعاء ، 31 أغسطس 2016 ، الساعة 8:23 صباحًا ، Matty Southall [email protected]
كتب:

عند إرجاع نوع الخريطة أو القائمة> يؤدي إلى فشل يقول لا يوجد
تعيين مجموعة النتائج لنوع "java.util.Map". أعرف "استعلام كائن SQL" (
http://jdbi.org/sql_object_api_queries/) لإعادة الكائنات ، لكنها
سيكون من الجيد أن تكون قادرًا على إرجاع هذا النوع عندما لا تريد ذلك
تحديد وكائن ومخطط مجموعة النتائج وهو أمر مفيد في بعض
سيناريوهات. (على سبيل المثال عند إجراء استعلام ارتباط معقد).

لقد تمكنت من التغلب على المشكلة من خلال توفير مصمم خرائط للنوع "java.util.Map"
باستخدام الكود أدناه.

Override https://github.com/Override
رميات الخريطة العامة (فهرس int ، ResultSet r ، StatementContext ctx)
SQLException {
Map rs = new HashMap <> () ؛

ResultSetMetaData metaData = r.getMetaData();

for (int i = 1; i <= metaData.getColumnCount(); i++) {
    rs.put(metaData.getColumnName(i), r.getObject(i));
}

return rs;

} `

ولكن سيكون من الرائع أن يتم تضمين هذا كمعيار.

ملاحظة. إذا كان أي شخص يعرف طريقة _pr الصحيحة_ للقيام بـ SQL ينضم بسهولة إلى JDBI
دون الحاجة إلى تحديد كائنات معقدة متعددة لكل صلة (أو ملف
كائن لكل مجموعة البيانات التي تريدها) ثم اسمحوا لي أن أعرف .. تحويل AFAIK
النتيجة تعيين في خريطة هو أسهل طريقة.

-
أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/jdbi/jdbi/issues/466 ، أو كتم صوت الموضوع
https://github.com/notifications/unsubscribe-auth/AACW5SBrje8A9H9bGFeZJxV4P3lyqK-qks5qlY5zgaJpZM4Jxq5o
.

يجب علينا أيضًا إضافة بعض أمثلة التعليمات البرمجية لطرق مختلفة للانضمام.

stevenschlansker قد تكون بعض العينات رائعة للانضمام. كيف تتعامل مع واحد إلى كثير أو واحد إلى واحد بشكل فعال؟

إن أداة go-to الخاصة بي لصلات واحد إلى n هي استخدام Query.fold :

getHandle().createQuery(
        "select foo_id, foo_name, bar_id, bar_name " +
        "from foo left join bar on foo.foo_id = bar.foo_id")
    .fold(new LinkedHashMap<String,Foo>(), (acc, rs, ctx) -> {
        String fooId = rs.getString("foo_id");
        Foo foo = acc.get(fooId);
        if (foo == null) {
            foo = new Foo(fooId, rs.getString("foo_name"));
            acc.put(fooId, foo);
        }

        String barId = rs.getString("bar_id");
        if (barId != null) {
            foo.addBar(new Bar(barId, rs.getString("bar_name"));
        }

        return acc;
    })
    .values();

qualidafial سيكون من المثير للاهتمام الاستفادة من java.util.Optional (https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html)

class Foo {
    private int foo;

    private List<Bar> bar;

    ...
}

قد لا يكون "شريط" مطلوبًا دائمًا ، فقد يكون من الأفضل لفه في Optional<List<Bar>> ؟ أيضا ماذا عن واحد لواحد واختياري؟

هذا بالتأكيد متروك لك. java.util.Optional مدعوم جيدًا فقط في الإصدار 3 (ألفا).

لذا ، بالنظر إلى كود v2 ، فإن دعم Map<String,Object> (أو List<Map<String,Object>> ) سيستغرق قدرًا كبيرًا من إعادة البناء على ResultReturnThing (نعم ، هذا هو اسم الفصل الحقيقي - إنه داخلي ). بالنظر إلى أن هناك حلًا بديلًا عن طريق إنشاء طريقة ملموسة والتراجع إلى واجهة برمجة التطبيقات بطلاقة ، لست متأكدًا مما إذا كنت أرغب في قضاء الوقت في هذا الإصدار 2.

الحل آخر في V2: هل يمكن أيضا استدعاء dbi.registerMapper(new DefaultMapper()) ، ولكن بسبب V2 ديه وعي محدود من الأدوية، وهذا سوف يسبب DefaultMapper لاستخدامها في _all_ Map.class أنواع الإرجاع، وليس فقط Map<String,Object> . إذا لم يكن لديك مصممو خرائط Map آخرين ، فمن المحتمل ألا يمثل ذلك مشكلة بالنسبة لك.

في الإصدار 3 ، يمكنك ببساطة استدعاء dbi.registerRowMapper(new DefaultMapper()) والذي يجب أن يتطابق بشكل صحيح مع توقيع النوع Map<String,Object> الكامل وتجاهل التوقيعات الأخرى. يمكننا أيضًا إضافته إلى قائمة مصممي الخرائط المسجلين افتراضيًا ، لذلك لا يتعين عليك فعل أي شيء.

qualidafial ألن تكون فكرة أفضل أن يكون لديك فئة ResultSet مخصصة بدلاً من التعامل مع Map<String, Object> ؟ الجزء المزعج من استخدام Map<String, Object> هو الاضطرار إلى الإرسال إلى النوع. هل هناك شيء يمكنك القيام به ".getInt (col)" على غرار طريقة عمل ResultSet (ولكن يجب إغلاق ResultSet)؟

matty ما تصفه هو إلى حد كبير نقطة ResultSetMapper .

يبدو أننا ندعم ذلك من خلال تسجيل DefaultMapper في jdbi3 ، كما نوفر الآن إمكانية الانضمام بسهولة عبر JoinRowMapper و RowView مما يجعل استرداد النتائج أفضل بكثير. أعتقد أنه لم يتبق شيء في هذه المشكلة إذن - لن نعود إلى الإصدار 2 ، آسف.

أخبرنا إذا لم يحل هذا مشكلتك!

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