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

时间:2019-05-16 04:07:38

标签: mybatis

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

枚举状态

package com.enum;

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

Aa类

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>

1 个答案:

答案 0 :(得分:0)

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

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

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

有一个内置的类型处理程序。
您可以为每个参数指定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}