Hibernate 执行SQL时设置枚举参数
有如下一个枚举,
package com.lyx;/** * Created by liyanxin on 2014/12/24. */public enum Gender { MAIL("男性"), FMAIL("女性"), UNSPECIFIED("未知"); private String value; private Gender(String value) { this.value = value; }// @Override// public String toString() {// return this.value;// }}
注意toString 方法已经注释掉了。
System.out.println(gender.toString()); //FMAIL
System.out.println(gender.name()); //FMAIL
System.out.println(gender.ordinal()); //1
这里toString方法调用的是 枚举父类 Enum 的toString方法,直接返回name属性值。
如果把 toString 方法的注释去掉,那么返回就是 value 值。。。
把 toString 注释去掉的一个在hibernate中的例子 如下,
实体类如下,
@Entity@Table(name = "tb_user")public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; private int age; @ManyToOne @JoinColumn(name = "role_id", unique = false, nullable = false) private Role role; private Gender gender; ..............}
你应该知道 Gender 枚举字段在数据库中,hibernate 默认映射为 int 类型的字段。看这里
有这么一个sql 查询,
public ListgetUserByGender0(Gender gender) { System.out.println(gender.toString()); System.out.println(gender.name()); System.out.println(gender.ordinal()); Session session = this.getCurrentSession(); String sql = "select * from tb_user where gender = :gender"; return session.createSQLQuery(sql).addEntity(User.class) .setParameter("gender", gender).list();}
设置一个枚举类型的参数,那么实际上 hibernate 在设置 gender 参数的时候,这个参数的值是 toString 的返回值,即枚举的name 属性值,FMAIL。明显就会查不出数据来。
而如果覆写了toString 方法,这里返回的value值,也会查不出数据来。
所以应该写成这样,setParameter("gender", gender.ordinal())
String sql = "select * from tb_user where gender = :gender";return session.createSQLQuery(sql).addEntity(User.class) .setParameter("gender", gender.ordinal()).list();
而在hibernate执行hql查询时,则没有这些弯弯绕,以上就可以忽略。
这是我遇到的一个坑。
=========END=========