JPA native 查询时枚举类型值转换 的解决办法

问题描述:

    在表A中,有一 varchar 类型的字段 f,这个字段对应于java实体中的属性类型是一个枚举E.现需要在表A中查出所有字段f包含了枚举E的某个值的记录.(字段f存的是多个用逗号隔开的枚举E的值,如:"0,0,1,0")

以下是枚举E的定义

public enum E {

Q(0),

W(1);

Integer value;

public E(Integer val){this.value = val}

}


以下是japRepositor:

public interface ERep extends JpaRepository {


@Query(nativeQuery = true,value="SELECT * FROM A AS a WHERE a.f LIKE %:e%" )

List findByE(@param("e") E e);

}


测试时给findByE方法赋值为E.Q,结果发现jap生成的sql语句是: SELECT * FROM A AS a WHERE a.f LIKE %Q%;

这显然不是我所期望的,我期望的结果应该是:

SELECT * FROM A AS a WHERE a.f LIKE %0%;


在google上搜索解决办法无果后,突然想到为啥会翻译成枚举值的字面值呢?我猜测,一定是spring 调用了E 的toString()方法,想到这里立马将枚举类E改为:

public enum E {

Q(0),

W(1);

Integer value;

public E(Integer val){this.value = val}

@Override

public String toString(){

        return this.value.toString();

}

}

再一测试果然就实现预想效果了.

遂在此记录一番!

你可能感兴趣的:(JPA native 查询时枚举类型值转换 的解决办法)