Jdbi: التعليق التوضيحيColumnName لا يعمل

تم إنشاؤها على ٢ نوفمبر ٢٠١٨  ·  12تعليقات  ·  مصدر: jdbi/jdbi

أريد استخدام التعليقات التوضيحية jdbi 3ColumnName لتعيين اسم عمود الجدول وحقل java bean ، ولكن في وقت التشغيل ، يطرح jdbi استثناءً. سؤالي لماذا تم طرح الاستثناء؟ هل استخدامي غير صحيح؟ كيفية حل هذه المشكلة؟
شكرا

جدول قاعدة البيانات:

CREATE TABLE `department` (
  `id` bigint(20)  NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL DEFAULT '' ,
  `business_system` tinyint(4)  NOT NULL ,
  `functional` tinyint(4)  NOT NULL ,
  `remark` varchar(100) NOT NULL DEFAULT ''
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

جافا فول:

<strong i="12">@Data</strong>
public class Department {
    private Long id;

    <strong i="13">@NotNull</strong>
    @Size(min = 3, max = 20)
    private String name;

    <strong i="14">@NotNull</strong>
    @ColumnName("business_system")
    private Integer businessSystem;

    <strong i="15">@NotNull</strong>
    @ColumnName("functional")
    private Integer functional;

    @Max(value = 200)
    private String remark;
  }

تحديث JDBI:

<strong i="19">@Override</strong>
public Long create(Department department) {
    String sql = "INSERT INTO department (name, business_system, functional, remark)"
        + "VALUES (:name, :business_system, :functional, :remark)";

return jdbi.withHandle(handle -> handle.createUpdate(sql)
    .bindBean(department)
    .executeAndReturnGeneratedKeys()
    .mapTo(Long.class)
    .findOnly());
}

النتيجة الجارية :

org.jdbi.v3.core.statement.UnableToExecuteStatementException: Unable to 
execute, no named parameter matches 'business_system'. [statement:"INSERT INTO 
department (name, business_system, functional, remark)VALUES (:name, 
:business_system, :functional, :remark)", rewritten:"INSERT INTO department 
(name, business_system, functional, remark)VALUES (:name, :business_system, 
:functional, :remark)", parsed:"ParsedSql{sql='INSERT INTO department (name, 
business_system, functional, remark)VALUES (?, ?, ?, ?)', 
parameters=ParsedParameters{positional=false, parameterNames=[name, 
business_system, functional, remark]}}", 
arguments:{ positional:{}, named:{}, finder:[{lazy bean property arguments 
"Department(id=null, name=test, businessSystem=2, functional=2, 
remark=test)"]}]
question

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

أوه نعم ، فقط تذكرت:

/**
 * Specify the binding or mapping name for a property or parameter explicitly.
 */
public <strong i="6">@interface</strong> ColumnName {

يجب علينا تغيير هذا الوصف.

ال 12 كومينتر

تنظر bindBean () فقط في التعليقات التوضيحية الموجودة على حروف التعيين والضوابط. انقل التعليق التوضيحي ColumnName إلى إحدى الطرق ، أو استخدم bindFields () بدلاً من ذلك

تنظر bindBean () فقط في التعليقات التوضيحية الموجودة على حروف التعيين والضوابط. انقل التعليق التوضيحي ColumnName إلى إحدى الطرق ، أو استخدم bindFields () بدلاً من ذلك

لقد نقلت التعليق التوضيحي لـ ColumnName إلى الحقل getter ، لكن الاستثناء ما زال يحدث

    @ColumnName("business_system")
    public Integer getBusinessSystem() {
        return businessSystem;
    }

bindFields () لا يعمل أيضًا. الاستثناء هو:

org.jdbi.v3.core.statement.UnableToExecuteStatementException: Unable to execute, no named parameter matches 'name'

أعتقد أن TechZi ربما وجد خطأ

image

على ما يبدو لم يكن لدينا حالة اختبار لهذا حتى الآن. هل المقصود استخدام @ColumnName للربط بالرغم من ذلك؟ معلمة الاستعلام ليست بالضرورة عمودًا.

image

تعمل هذه الإضافة البسيطة على إصلاح المشكلة الموضحة هنا ... لكنني لا أعرف ما إذا كنا نريد إضافة هذا. qualidafial هل هذه الرائحة سيئة لك أم سأذهب إلى العلاقات العامة؟

يااه غريب. أنت على حق - التعليق التوضيحي @ColumnName مخصص فقط لرسم الخرائط. عند الربط ، ما عليك سوى استخدام اسم الخاصية.

لذا ضع :businessSystem بدلاً من ذلك لمتغير الربط الخاص بك

إذن القضية مغلقة: باطل إذن؟

أوه نعم ، فقط تذكرت:

/**
 * Specify the binding or mapping name for a property or parameter explicitly.
 */
public <strong i="6">@interface</strong> ColumnName {

يجب علينا تغيير هذا الوصف.

إذا كان هناك سبب مقنع لكونه مفيدًا ، فيمكننا توسيع ColumnName للعمل أيضًا من أجل الارتباطات. ومع ذلك ، لا أرى سببًا - يبدو دائمًا أنه من الأفضل لي ببساطة تغيير اسم الربط في SQL لمطابقة الاسم التلقائي. أو يمكننا اختيار دعمه لمجرد أغراض التماثل ، حتى لا يتفاجأ الآخرون مثل qualidafial كان

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

أنا منقسمة ... أريد تناسقًا ، أريد أن أكون قادرًا على مطابقة مدخلاتي مع استفساري دون الحاجة إلى تغيير نص الاستعلام إذا لم أرغب في ذلك (قد يكون ذلك غير مريح أو محفوف بالمخاطر لأي شيء سبب) ، وأود أن أبقي تعقيد jdbi منخفضًا قدر الإمكان من خلال عدم الاستسلام لتسلل الميزة. ¯ \ _ (ツ) _ / ¯

TechZi هل تحتاج أي شيء آخر أم يمكن إغلاق هذا؟

يبدو أن المشكلة الأصلية قد تم حلها ، لذلك دعونا نغلق

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