当前位置: 首页 > 知识库问答 >
问题:

将枚举值存储到数据库中

红富
2023-03-14

我希望使用枚举将值映射到数据库表行:

@Getter
@Setter
public class BusinessCustomersSearchParams {

    private String title;

    private List<String> status;

    private LocalDateTime createdAt;

    private LocalDateTime updatedAt;
}
@Override
public Page<BusinessCustomersFullDTO> findBusinessCustomers(BusinessCustomersSearchParams params, Pageable pageable)
{
    Specification<BusinessCustomers> spec = (root, query, cb) -> {
        List<Predicate> predicates = new ArrayList<>();
        if (params.getTitle() != null) {
            predicates.add(cb.like(cb.lower(root.get("description")), "%" + params.getTitle().toLowerCase() + "%"));
        }

        final List<String> statuses = Optional.ofNullable(params.getStatus()).orElse(Collections.emptyList());
        if (statuses != null && !statuses.isEmpty()){
            List<BusinessCustomersStatus> statusesAsEnum = statuses.stream()
                .map(status -> BusinessCustomersStatus.fromStatus(status))
                .collect(Collectors.toList())
                ;

            predicates.add(root.get("status").in(statusesAsEnum));
        }

        return cb.and(predicates.toArray(new Predicate[predicates.size()]));
    };
    return businessCustomersService.findAll(spec, pageable).map(businessCustomersMapper::toFullDTO);
}
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter
public class BusinessCustomersStatusAttributeConverter
    implements AttributeConverter<BusinessCustomersStatus, String> {

  public String convertToDatabaseColumn( BusinessCustomersStatus value ) {
    if ( value == null ) {
      return null;
    }

    return value.getStatus();
  }

  public BusinessCustomersStatus convertToEntityAttribute( String value ) {
    if ( value == null ) {
      return null;
    }

    return BusinessCustomersStatus.fromStatus( value );
  }

}
package org.merchant.database.service.businesscustomers;

public enum BusinessCustomersStatus {
    A("active"),
    O("onboarding"),
    N("not_verified"),
    V("verified"),
    S("suspended"),
    I("inactive");

    private String status;

    BusinessCustomersStatus(String status)
    {
        this.status = status;
    }

    public String getStatus() {
        return status;
    }

    public static BusinessCustomersStatus fromStatus(String status) {
        switch (status) {
            case "active": {
                return A;
            }

            case "onboarding": {
                return O;
            }

            case "not_verified": {
                return NV;
            }

            case "verified": {
                return V;
            }

            case "suspended": {
                return S;
            }

            case "inactive": {
                return I;
            }

            default: {
                throw new UnsupportedOperationException(
                    String.format("Unkhown status: '%s'", status)
                );
            }
        }
    }
}
@Entity
@Table(name = "business_customers")
public class BusinessCustomers implements Serializable {
   
    ..........
    @Convert( converter = BusinessCustomersStatusAttributeConverter.class )
    private BusinessCustomersStatus status;
    ......
}

我想使用status=active从FE中搜索和获取状态,但只存储到数据库行字段中的符号A。

我如何将枚举键A存储到数据库中?

共有1个答案

蔡宏大
2023-03-14

请注意BusinessCustomersStatusAttributeConverter中的ConvertToDatabaseColumn()方法

它应该返回value.name()而不是value.getstatus()

 类似资料:
  • 问题内容: 有人可以告诉我,在以下情况下如何进行? 接收文件(MS文件,ODS,PDF) 通过Apache Tika提取公元核心元数据+通过jackrabbit-content-extractors提取内容 使用Jackrabbit将文档(内容)及其元数据存储到存储库中 ? 检索文档+元数据 我对第3点和第4点感兴趣… 详细信息:该应用程序正在以交互方式处理文档(一些分析-语言检测,单词计数等。+

  • 我想将< code>socket.getSocket()和< code > socket status . getsocketstatus()存储在< code>HashMap中。但是< code>hMap.put(socket.getSocket()、socket status . getsocketstatus());引发< code > NullPointerException 。我该如何解

  • 我正在尝试存储和检索一个enum类,以便稍后可以找到正确的类型(基于配置)并对其调用ValueOf来解析字符串。如何放置/获取然后调用的值? 在伪代码中,它看起来像这样: 我怎么能这样呢? 为了提供一些关于我为什么这样做的背景-我有多个这样的枚举类型,我得到一个输入,告诉我它是什么样的枚举(在文本中)和枚举中的一个值,所以我想从映射中查找枚举类,然后调用它的静态ValueOf,它将正确解析。 注意

  • 问题内容: 将枚举保存到数据库中的最佳方法是什么? 我知道Java提供和方法来枚举值转换为字符串和背部。但是还有其他(灵活的)选项来存储这些值吗? 有没有一种聪明的方法可以使枚举成为唯一的数字(使用不安全)? 更新: 感谢您提供的所有出色且快速的答案!就像我怀疑的那样。 但是要注意“工具包”;那是一种方式。问题是我必须向创建的每个Enum类型添加相同的方法。那就是很多重复的代码,并且目前Java不

  • 问题内容: 我有一个当前状态,其中MyType表示类型表,其列为: 并使用ID参数和方法来识别类型: 我的新要求是支持Type表中还存在值,我找到了动态枚举的答案,但是接受答案不是这样做 否。枚举始终固定在编译时。您执行此操作的唯一方法是动态生成相关的字节码。 从数据库(例如ID 30)中 查找 值(主要是ID)的更好解决方案是什么 我可以 扩展 现有状态而不是更改它吗?如何使用方法从数据库添加额