R2DBC:将 Spring 数据实体中特定列的整数转换为布尔值

问题描述 投票:0回答:1

我将 Spring Data R2DBC 与 MySQL 结合使用,在将 INT 类型的数据库列映射到实体中的布尔字段时,我遇到了类型转换问题。

实体定义:

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;

@Table("users")
public class UserEntity {

@Id
private Long id;

@Column("sms_list")
private Boolean smsPermited;


public Boolean getSmsList() {
    return this.smsPermited;
}

public void setSmsList(Boolean smsPermited) {
    this.smsPermited = smsPermited;
}

public Boolean getSmsPermited() {
    return smsPermited;
}

public void setSmsPermited(Boolean smsPermited) {
    this.smsPermited = smsPermited;
}

}

数据库架构:

CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
sms_list INT(11) NOT NULL DEFAULT 0

);

运行应用程序时,我遇到以下错误:

No converter found capable of converting from type [java.lang.Integer] to type [java.lang.Boolean]

Spring Data R2DBC 似乎不会自动将 INT 数据库列转换为我的实体中的布尔值。

我尝试过的:

1.在Getter上使用@Column:

  • 我尝试将 @Column("sms_list") 注释移至 getter 方法而不是字段。
  • 错误仍然存在。

2.手动处理Getter/Setter中的转换::

  • 我尝试定义一个 getter 和 setter,在整数和布尔值之间手动转换。

3.全球转换器:::

  • 我知道涉及创建全局转换器的解决方案,但我想避免这种方法,因为它会影响我的应用程序中的全局所有整数字段。

预期行为

我想要:

  1. 在我的实体中将 smsPermited 字段保留为布尔值,以供应用程序级使用。
  2. 在数据库中将该值存储为 1(真)或 0(假),而不影响其他整数字段。

问题:

  • 有没有一种方法可以在不使用全局 R2dbcCustomConversions 的情况下本地定义此特定字段的类型转换?
  • Spring Data R2DBC 中是否有处理此类类型不匹配的最佳实践?
  • 我使用单独的 getter/setter 进行转换的方法是一种好的做法,还是有更好的解决方案?

Spring Boot 和库版本:

  • 春季启动:5.6.15
  • Spring Data R2DBC:3.4.1
  • 数据库:MySQL 5.6
  • Java版本:17
java spring-boot spring-webflux spring-data-r2dbc
1个回答
0
投票

将 SMSPermission 设置为 int,然后在实体中创建一个新方法,如下所示

public Boolean getSmsListAsBoolean() {
       // use this.smsPermitted to apply your logic how to convert int from
       // db to boolean
    }

您的整个实体将如下所示:

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;

@Table("users")
public class UserEntity {

@Id
private Long id;

@Column("sms_list")
private Boolean smsPermited;


public Boolean getSmsList() {
    return this.smsPermited;
}

public void setSmsList(Boolean smsPermited) {
    this.smsPermited = smsPermited;
}

public Boolean getSmsPermited() {
    return smsPermited;
}

public void setSmsPermited(Boolean smsPermited) {
    this.smsPermited = smsPermited;
}

public Boolean getSmsListAsBoolean() {
   // use this.smsPermitted to apply your logic how to convert int from
   // db to boolean
}
© www.soinside.com 2019 - 2024. All rights reserved.