问题描述:
在表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<A,Integer> {
@Query(nativeQuery = true,value="SELECT * FROM A AS a WHERE a.f LIKE %:e%" )
List<A> 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();
}
}
再一测试果然就实现预想效果了.
遂在此记录一番!