Как получить порядковый номер перечисления java в запросе SELECT MyBatis - PullRequest
0 голосов
/ 16 мая 2019

Как получить порядковый номер java enum непосредственно в следующем запросе SELECT?

Enum Status

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 голосов
/ 16 мая 2019

Вы можете использовать выражение OGNL с ${}.

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

Ниже приведен исходный ответ.
Неправильно предполагалось, что перечисление передается в качестве параметра.

Для этого есть встроенный обработчик типа.
Вы можете указать javaType и typeHandler для каждого параметра.Например,

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}
...