Jdbi: [jdbi3] دعم الجمل الاختيارية في SQL للمعلمات الاختيارية المرتبطة.

تم إنشاؤها على ٣١ مايو ٢٠١٦  ·  3تعليقات  ·  مصدر: jdbi/jdbi

هناك الكثير من السيناريوهات حيث تريد تضمين / استبعاد جزء من جملة SQL اعتمادًا على ما يرتبط بمعامل معين:

String SELECT = "SELECT * FROM something { id => WHERE id = :id }";

// these queries would be executed with the WHERE clause excluded:
handle.createQuery(SELECT).list();
handle.createQuery(SELECT).bind("id", null).list();
handle.createQuery(SELECT).bind("id", Optional.empty()).list();

// these queries would be executed with the WHERE clause included:
handle.createQuery(SELECT).bind("id", 1).list();
handle.createQuery(SELECT).bind("id", Optional.of(1)).list();

من المؤكد أن { id => WHERE id = :id } مطروح للنقاش - سيتعين علينا التأكد من أن أي بناء جملة اخترناه لا يتعارض مع رموز SQL المميزة.

يمكن تنفيذ ذلك في أدوات كتابة العبارة الافتراضية الخاصة بنا.

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

كانت القيمة الرئيسية التي كنت أبحث عنها هي القدرة على مزج ومطابقة عوامل التصفية في الاستعلامات ، على سبيل المثال في نموذج بحث مع عدة حقول اختيارية. ومع ذلك ، كما أشار stevenschlansker ، فإن هذا ممكن بالفعل ضمن بناء جملة SQL:

SELECT FROM thing
WHERE (:createdOn.start IS NULL OR created_on >= :createdOn.start)
AND (:createdOn.end IS NULL OR created_on <= :createdOn.end)
AND (:name IS NULL OR name LIKE :name || '%')
AND (:id IS NULL OR id = :id)

إغلاق.

ال 3 كومينتر

YMMV ، لكن IMO هذا لا ينبغي أن يكون هدفًا تصميميًا. أولاً ، هذا هو الشيء الذي يقوم به محدد بيان StringTemplate جيدًا. بينما لا يعرف StringTemplate عن bind وجه التحديد ، أرى ذلك كميزة ؛ أريد أن يتم تنبيهي عندما أنسى ربط متغير أو ربطه بشكل غير صحيح. وأريد بالتأكيد التفكير في LIST ALL و LIST WITH FILTER كعمليتين منفصلتين ، لأن قاعدة البيانات الخاصة بي ستتعامل معهما بشكل مختلف.

باستخدام StringTemplate ، يكون المثال المقدم مباشرًا مثل:

listAll() ::= <<
  SELECT id, data FROM something
>>

listById() ::= <<
  <listAll()> WHERE id = :id
>>

لا ، هذا ليس موجزا ، ولكن ما يخسره في الإيجاز يكتسبه في السلطة ؛ يمكنني إعادة استخدام الجزء الأول من الاستعلام بأشكال متعددة ، وجعلها متسقة ، وأحصل على الحماية من أخطائي الخاصة بنسيان الربط أو الربط عن طريق الخطأ في حالة الاستخدام الخاطئ.

أنا أيضا إلى حد ما "مه" على هذه الميزة. خيار آخر غير موجز ولكنه لا يتطلب أي دعم إضافي:

... WHERE (id = :id OR :id IS NULL) مما يعني أنه إذا أجريت ربطًا صريحًا NULL فستحصل على معلمة "اختيارية".

ربما إذا كنت تريد ذلك حقًا ، فمن المناسب كإعادة كتابة جملة مختلفة قائمة بذاتها؟

كانت القيمة الرئيسية التي كنت أبحث عنها هي القدرة على مزج ومطابقة عوامل التصفية في الاستعلامات ، على سبيل المثال في نموذج بحث مع عدة حقول اختيارية. ومع ذلك ، كما أشار stevenschlansker ، فإن هذا ممكن بالفعل ضمن بناء جملة SQL:

SELECT FROM thing
WHERE (:createdOn.start IS NULL OR created_on >= :createdOn.start)
AND (:createdOn.end IS NULL OR created_on <= :createdOn.end)
AND (:name IS NULL OR name LIKE :name || '%')
AND (:id IS NULL OR id = :id)

إغلاق.

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