首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Mybatis不能正确地映射一个简单的ENUM?

为什么Mybatis不能正确地映射一个简单的ENUM?
EN

Stack Overflow用户
提问于 2020-06-09 02:48:04
回答 1查看 1K关注 0票数 0

据我所知,我没有做任何不寻常的事。我有一个spring引导应用程序,它使用mybatis:

代码语言:javascript
复制
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1'

我有一个application.properties配置,这个配置非常简单:

代码语言:javascript
复制
## MyBatis ##
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.default-statement-timeout=30

我的数据库表如下所示:

代码语言:javascript
复制
CREATE TABLE workspace_external_references (
    id CHAR(36) PRIMARY KEY,

    workspace_id CHAR(36) NOT NULL,
    site VARCHAR(255) NOT NULL,
    external_id VARCHAR(255) NOT NULL,

    created_at DATETIME(6) NOT NULL DEFAULT NOW(6),
    updated_at DATETIME(6) NOT NULL DEFAULT NOW(6),

    FOREIGN KEY (workspace_id) REFERENCES workspaces (id) ON DELETE CASCADE
)

只有一个像这样的条目:

代码语言:javascript
复制
'a907c0af-216a-41e0-b16d-42107a7af05f', 'e99e4ab4-839e-405a-982b-08e00fbfb2d4', 'ABC', '6', '2020-06-09 00:19:20.135822', '2020-06-09 00:19:20.135822'

在mapper文件中,我选择了如下所示的所有引用:

代码语言:javascript
复制
@Select("SELECT * FROM workspace_external_references WHERE workspace_id = #{workspaceId}")
List<WorkspaceExternalReference> findByWorkspace(@Param("workspaceId") final UUID workspaceId);

它应该映射到的java对象如下所示:

代码语言:javascript
复制
public class WorkspaceExternalReference {
    private UUID id;
    private UUID workspaceId;
    private Sites site;

    private String externalId;

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    public WorkspaceExternalReference(
            final Sites site,
            final UUID workspaceId,
            final String externalId) {
        this.site = site;
        this.workspaceId = workspaceId;
        this.externalId = externalId;
    }
}

public enum Sites {
   ABC, XYZ;
}

Sooooo为什么不能工作?,我得到了这个错误:

代码语言:javascript
复制
Caused by: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'id' from result set.  Cause: java.lang.IllegalArgumentException: No enum constant com.acme.Sites.a907c0af-216a-41e0-b16d-42107a7af05f
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-09 03:39:30

当没有默认构造函数时,您需要让MyBatis知道哪些列要显式地传递给构造函数(在大多数情况下)。

有了注释,它将如下所示。

您可以在XML中使用<resultMap><constructor>

代码语言:javascript
复制
@ConstructorArgs({
  @Arg(column = "site", javaType = Sites.class),
  @Arg(column = "workspace_id", javaType = UUID.class),
  @Arg(column = "external_id", javaType = String.class)
})
@Select("SELECT * FROM workspace_external_references WHERE workspace_id = #{workspaceId}")
List<WorkspaceExternalReference> findByWorkspace(@Param("workspaceId") final UUID workspaceId);

其他列(即idcreated_atupdated_at)将通过设置器(如果有)或反射自动映射。

或者,只需将默认构造函数(no-arg)添加到WorkspaceExternalReference类。然后,所有列都将在类实例化后自动映射。

注意:要使其正常工作,需要为UUID注册一个类型处理程序,但您似乎已经完成了(否则参数映射将无法工作)。

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

https://stackoverflow.com/questions/62274210

复制
相关文章

相似问题

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