文档章节

Hibernate 执行SQL时设置枚举参数

秋风醉了
 秋风醉了
发布于 2015/07/18 17:34
字数 417
阅读 55
收藏 0

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

© 著作权归作者所有

秋风醉了
粉丝 247
博文 542
码字总数 412294
作品 0
朝阳
程序员
私信 提问
Java面试----2018年MyBatis常见实用面试题整理

Java面试----2018年MyBatis常见实用面试题整理 1、什么是MyBatis? 答:MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。 2、讲下MyBatis的缓存 答:MyBatis的缓存分为一级缓存...

优惠券活动
2018/04/29
0
0
guzz 1.2.8 正式版发布--支持注解与动态SQL

Guzz 是一种用来进行快速开发和高性能网站设计的框架,用于替代或者补充hibernate或ibatis的持久化实现,并提供更多的大型系统架构设计 支持。guzz的目标是使得大型化网站设计更加简单,团队...

红薯
2010/06/21
694
0
Guzz1.2.8 beta2--支持动态加载在线调试SQL

guzz是一套用来解决ORM、多数据源管理、以及通用数据计算的数据层框架,为系统在数据层的设计提供一站式解决方案。guzz可以看作是 ibatis/hibernate的一大的延伸,并可以取代这2个东西。 gu...

谷子发布
2010/05/26
278
0
hibernate sql 查询

Hibernate 支持使用原生的SQL查询,使用原生SQL查询可以利用某些数据库特性,原生SQL查询也支持将SQL语句放在配置文件中配置,从而提高程序的解耦,命名SQL查询还可以用于调用存储过程。 SQL查...

DaDa-da
2018/04/23
0
0
扼杀性能的 10 个常见 Hibernate 错误

医疗类app开发 ¥11000 微信二次开发 ¥3500 抽奖活动前端开发 ¥7000 官网UI设计 ¥4000 搜索匹配方案 ¥25000 艺术品交易网站开发 ¥80000 本文由码农网 – 小峰原创翻译,转载请看清文末的...

抽奖活动前端开发 ¥7000
2017/12/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

import java.util.Arrays; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { Arrays.sort(array); int count=0; for(int i=0;i<array.le......

南桥北木
25分钟前
1
0
关于FLAG_ACTIVITY_NEW_TASK的使用

参考文章: https://blog.csdn.net/u010389391/article/details/78558475 Context调用startActivity, 有部分情况会报出如下错误: Caused by: android.util.AndroidRuntimeException: Calli......

Gemini-Lin
41分钟前
0
0
Python开发工具:Webware for Python

原文来之:https://www.oschina.net/p/webware+for+python 前言 Webware for Python 是一组 Python 包和工具用来开发面向对象的 Web 应用。良好的设计模式,包含一个快速的应用服务器、Servl...

A_裙232550246
50分钟前
1
0
高并发场景下的缓存有哪些常见的问题?

一、缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。 这就比较依赖缓存的过期和更新...

别打我会飞
今天
3
0
List list = new ArrayList()为何父类引用指向子类对象(多态)

态:要有继承,方法的重写,父类引用指向子类对象 疑问一:父类引用指向子类对象 与指向父类对象 Animal cat = new Cat(); //向上转型。 父类引用指向子类对象,该引用不能再访问子类新增加的...

architect刘源源
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部