首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么JDBI 3 @ColumnName注解不起作用?

为什么JDBI 3 @ColumnName注解不起作用?
EN

Stack Overflow用户
提问于 2018-11-02 22:11:14
回答 1查看 2.6K关注 0票数 5

我想使用jdbi 3 @ColumnName注释来映射表的列名和java bean字段,但是在运行时jdbi抛出了一个异常。我的问题是为什么抛出异常?我的用法有误吗?如何解决这个问题?谢谢

数据库表:

代码语言:javascript
复制
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;

Java Bean:

代码语言:javascript
复制
@Data
public class Department {
    private Long id;

    @NotNull
    @Size(min = 3, max = 20)
    private String name;

    @NotNull
    @ColumnName("business_system")
    private Integer businessSystem;

    @NotNull
    @ColumnName("functional")
    private Integer functional;

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

JDBI更新:

代码语言:javascript
复制
@Override
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());

}

单元测试运行结果:

代码语言:javascript
复制
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)"]}]
EN

回答 1

Stack Overflow用户

发布于 2018-12-13 08:49:54

Jdbi维护者在这里。四个误区共同导致你的代码不能工作:

首先,@ColumnName定义了一个单向映射,仅用于将列名映射到对象属性/字段/构造函数参数。因此,BeanMapper将遵守@ColumnName注释,但bindBean()会忽略它。

其次,BeanMapper只检测getters和setters上的@ColumnName,而不是字段。由于您使用的是Lombok的@Data注释,因此@ColumnName注释实际上是放在字段中的。Lombok有一种非常丑陋的方式来指定getter或setter的注释:

代码语言:javascript
复制
@NotNull
@Getter(onMethod=@__(@ColumnName("business_system")))
private Integer businessSystem;

@NotNull
@Getter(onMethod=@__(@ColumnName("functional")))
private Integer functional;

第三,bindBean()基于bean属性名而不是列名绑定命名参数。因此,您的命名参数应该是:camelCase而不是:snake_case

代码语言:javascript
复制
INSERT INTO department (name, business_system, functional, remark)
VALUES (:name, :businessSystem, :functional, :remark)
--                      ^ camel case property name

最后,JDBI3已经将蛇形大小写的列名与驼峰大小写的属性名称进行了开箱即用的匹配。例如:列foo_bar将自动映射到fooBar属性,不需要@ColumnName注释。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53120150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档