• MyBatis:枚举类型与字符串比较


    问题描述

            在MyBatis的xml配置文件中,默认情况下枚举类型的属性与字符串类型的值是无法比较的,这和Date日期类型不能和""空字符串比较是一样的,会报错:

    ### Error querying database.  
    Cause: java.lang.IllegalArgumentException: 
    invalid comparison: com.constant.StatusEnum and java.lang.String
     

    解决方式

    类型定义

    SysUser系统用户

            例如,现在有一个Gender性别为枚举类型的SysUser类,

    1. package com.example.soil_backend.model.entity;
    2. import com.baomidou.mybatisplus.annotation.*;
    3. import java.io.IOException;
    4. import java.time.LocalDateTime;
    5. import java.io.Serializable;
    6. import com.example.soil_backend.common.Validator;
    7. import com.example.soil_backend.enums.GenderEnum;
    8. import com.example.soil_backend.enums.RoleEnum;
    9. import com.example.soil_backend.model.TbBase;
    10. import com.fasterxml.jackson.annotation.JsonIgnore;
    11. import lombok.Data;
    12. import lombok.EqualsAndHashCode;
    13. import lombok.experimental.Accessors;
    14. import org.apache.ibatis.type.ByteArrayTypeHandler;
    15. import org.springframework.web.multipart.MultipartFile;
    16. /**
    17. * SysUser
    18. *
    19. * @author XiMumu
    20. * @since 2024-02-18
    21. */
    22. @Data
    23. @EqualsAndHashCode(callSuper = true)
    24. @Accessors(chain = true)
    25. @TableName("sys_user")
    26. public class SysUser extends TbBase implements Serializable {
    27. private static final long serialVersionUID = -6472629353385247605L;
    28. /**
    29. * 用户编码ID;自增
    30. */
    31. @TableId(value = "user_id", type = IdType.AUTO)
    32. private Integer userId;
    33. /**
    34. * 账户名-必须为邮箱号
    35. */
    36. private String userName;
    37. /**
    38. * 账户密码
    39. */
    40. @JsonIgnore //标记在属性或者方法上,返回的json数据即不包含该属性
    41. private String passWord;
    42. /**
    43. * 昵称
    44. */
    45. private String nickName;
    46. /**
    47. * 手机号
    48. */
    49. private String telPhone;
    50. /**
    51. * 性别:1-男;2-女;3-未知
    52. */
    53. private GenderEnum gender;
    54. /**
    55. * 用户头像URL
    56. */
    57. @TableField(value = "photo_url",typeHandler = ByteArrayTypeHandler.class)
    58. private byte[] photoUrl;
    59. /**
    60. * 是否删除:1-使用中;2-已删除
    61. */
    62. @JsonIgnore //标记在属性或者方法上,返回的json数据即不包含该属性
    63. private Integer delFlag;
    64. /**
    65. * 用户角色[管理员:ADMIN;普通用户:COMMON]
    66. */
    67. private RoleEnum userRole;
    68. }

    Gender枚举类型

    1. package com.example.soil_backend.enums;
    2. import com.baomidou.mybatisplus.annotation.EnumValue;
    3. import com.fasterxml.jackson.annotation.JsonValue;
    4. import lombok.Getter;
    5. /**
    6. * 管理员:ADMIN;普通用户:COMMON
    7. */
    8. @Getter
    9. public enum RoleEnum {
    10. ADMIN("ADMIN","管理员"),
    11. COMMON("COMMON","普通用户");
    12. //编码
    13. @EnumValue
    14. @JsonValue //规定返回前端的为1/2
    15. private final String code;
    16. //描述信息
    17. private final String desc;
    18. RoleEnum(String code, String desc) {
    19. this.code = code;
    20. this.desc = desc;
    21. }
    22. public static boolean isValidEnum(String code){
    23. for (RoleEnum roleEnum : RoleEnum.values()) {
    24. if (roleEnum.getCode().equals(code)){
    25. return true;
    26. }
    27. }
    28. return false;
    29. }
    30. @Override
    31. public String toString() {
    32. return "RoleEnum{" +
    33. "code=" + code +
    34. ", desc='" + desc + '\'' +
    35. '}';
    36. }
    37. }

    错误写法

            如下为原始的写法,会报错,

    1. <update id="insertUserByResetDelFlag">
    2. UPDATE sys_user
    3. <set>
    4. ...
    5. <if test="sysUser.gender != null and sysUser.gender != ''">
    6. gender = #{sysUser.gender},
    7. if>
    8. ...
    9. set>
    10. update>

     

    测试可用的写法

    形式1:通过枚举字段的方法进行比较       

    1. <update id="insertUserByResetDelFlag">
    2. UPDATE sys_user
    3. <set>
    4. ...
    5. <if test="sysUser.gender != null and sysUser.gender != ''">
    6. gender = #{sysUser.gender},
    7. if>
    8. ...
    9. set>
    10. update>

            需要改为以下的书写方式,

    1. <update id="insertUserByResetDelFlag">
    2. UPDATE sys_user
    3. <set>
    4. ...
    5. <if test="sysUser.gender != null and sysUser.gender.getCode() == 1">
    6. gender = 1,
    7. if>
    8. <if test="sysUser.gender != null and sysUser.gender.getCode() == 2">
    9. gender = 2,
    10. if>
    11. <if test="sysUser.gender != null and sysUser.gender.getCode() == 3">
    12. gender = 3,
    13. if>
    14. ...
    15. set>
    16. update>

    形式2:通过枚举常量的方法进行比较

    1. <update id="insertUserByResetDelFlag">
    2. UPDATE sys_user
    3. <set>
    4. ...
    5. <if test="sysUser.gender != null and sysUser.gender.toString() == @com.example.soil_backend.enums.GenderEnum.MALE.toString()">
    6. gender = 1,
    7. if>
    8. <if test="sysUser.gender != null and sysUser.gender.toString() == @com.example.soil_backend.enums.GenderEnum.FEMALE.toString()">
    9. gender = 2,
    10. if>
    11. <if test="sysUser.gender != null and sysUser.gender.toString() == @com.example.soil_backend.enums.GenderEnum.UNKNOWN.toString()">
    12. gender = 3,
    13. if>
    14. ...
    15. set>
    16. update>

  • 相关阅读:
    IoT 边缘集群基于 Kubernetes Events 的告警通知实现(二):进一步配置
    【脑与认知科学】【n-back游戏】
    Scratch软件编程等级考试四级——20210320
    C语言:指针(二)
    苹果Ios系统app应用程序开发者如何获取IPA文件签名证书时需要注意什么?
    使用密集预测变压器的图像语义分割--附源码下载
    postman安装使用教程
    C++获取商店应用(msix应用)桌面快捷方式的安装目录
    [附源码]java毕业设计源冀平行进口车系统
    ctf_BUUCTF_web(1)
  • 原文地址:https://blog.csdn.net/weixin_43524214/article/details/136753581