أريد استخدام التعليقات التوضيحية 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)"]}]
تنظر 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 ربما وجد خطأ
على ما يبدو لم يكن لدينا حالة اختبار لهذا حتى الآن. هل المقصود استخدام @ColumnName
للربط بالرغم من ذلك؟ معلمة الاستعلام ليست بالضرورة عمودًا.
تعمل هذه الإضافة البسيطة على إصلاح المشكلة الموضحة هنا ... لكنني لا أعرف ما إذا كنا نريد إضافة هذا. 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 هل تحتاج أي شيء آخر أم يمكن إغلاق هذا؟
يبدو أن المشكلة الأصلية قد تم حلها ، لذلك دعونا نغلق
التعليق الأكثر فائدة
أوه نعم ، فقط تذكرت:
يجب علينا تغيير هذا الوصف.