如何在 MyBatis SELECT 查询中获取 java 枚举序数值

How to get java enum ordinal value in MyBatis SELECT query

如何在下面的SELECT查询中直接获取java枚举序数值?

枚举状态

package com.enum;

public enum Status {
    A, B, C, D, E;
}

Class啊

package com.prj;

import com.enum.Status;

public class Aa {
    private Long id;
    private String name;
    private Status status; // store enum ordinal in table aa
}

以下查询无效。

<select id="getAaValidIds" resultType="Long">
    SELECT
        aa.id
    FROM
        aa aa
    WHERE
        aa.status = @com.enum.Status$A.ordinal() 
        OR aa.status = @com.enum.Status$B.ordinal() 
</select>

您可以将 OGNL 表达式与 ${} 一起使用。

WHERE
  aa.status = ${@com.enum.Status@A.ordinal()}
  OR aa.status = ${@com.enum.Status@B.ordinal()}

以下为原答案
它错误地假定枚举作为参数传递。

有一个 built-in 类型处理程序。
您可以为每个参数指定 javaTypetypeHandler。例如

WHERE
  aa.status = #{status,javaType=com.enum.Status,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}
  OR aa.status = #{status,javaType=com.enum.Status,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}

或者,如果您总是将此类型处理程序用于 Status,最好在配置中全局注册它。

<typeHandlers>
  <typeHandler
    javaType="com.enum.Status"
    handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" />
</typeHandlers>

那你就可以写...

WHERE
  aa.status = #{status}
  OR aa.status = #{status}