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 类型的字段。看这里http://my.oschina.net/xinxingegeya/blog/359968
有这么一个sql 查询,
public List<User> getUserByGender0(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=========