Hibernate 执行SQL时设置枚举参数

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======================================

你可能感兴趣的:(Hibernate 执行SQL时设置枚举参数)