• Hibernate的QBC检索方式


    一直习惯了Hibernate的HQL查询,一直也觉得挺方便,对于最近项目里出现的QBC(org.hibernate.Criteria接口)也是报着一种看看的心理,因为做j2ee这么久了,也写了一大堆HQL的工具类,起初的心理也只是看看而已
    Session session =HibernateSessionFactory.currentSession();
    首先从工厂类中获得一个Session,这个没什么好说的.用myeclipse的人都知道可以自动生成,以及从ThreadLocal内获取一个连接,这样可以防止lazy异常以及提高效率
    下面就是主角了,现在假设有一个Student类,内有id,name,age属性
    String hql = "from Student s";
    按照以前的做法,我通常是
    Query query = session.createQuery(hql);
    或者要按照条件检索的话.
    String hql = "from Student s where s.name like '王%'"
    Query query = session.createQuery(hql);
    不用HQL而使用QBC的话,那么代码为:
    Criteria criteria =session.createCriteria(Student.class);
    Criterion criterion = Expression.like("name","王%");
    这样还看不出来.那我们把检索条件加上年龄为22.
    HQL:
    String hql = "from Student s where s.name like '王%' and s.age= 22 ";
    Query query = session.createQuery(hql);
    List list = query.list();
    QBC:
    Criteria criteria =session.createCriteria(Student.class);
    Criterion criterion1 = Expression.like("name","王%");

    或者“criteria.add(Restrictions.eq(propertyName, value))”

    因为public final class Expression extends Restrictions


    Criterion criterion2 = Expression.eq("age",newInteger(22));
    criteria.add(criterion1).add(criterion2);
    List list = criteria.list();

    看上去烦琐很多.但是做过项目的人都知道,当一个模块业务逻辑发生改变的时候,往往要重写sql,最烦也是最讨厌的就是拿着别人的hql或者sql,两眼瞪的溜园找到底要修改什么地方呢?
    如果使用QBC大大的增加了代码的可读性,以及可维护性.
    需要注意的是null值
    比如我们要查找姓名为null的Student对象时应该这么写
    Criteria criteria =session.createCriteria(Student.class);
    Criterion criterion = Expression.isNull("name");
    criteria.add(criterion).list();
    以及使用between...and的时候
    Criteria criteria =session.createCriteria(Student.class);
    Criterion criterion1 = Expression.ge("age",new Integer(20));//下限
    Criterion criterion2 = Expression.le("age",new Integer(25));//上限
    //这里也可以把上述两个条件添加到第三个条件里
    Criterion criterion3 =Expression.and(criterion1,criterion2);
    criteria.add(criterion3).list();
    相当于from Student s where s.age between 20 and 25
    等同于from Student s where s.age >= 20 and s.age <=25

    下面是就HQL和QBC常用的查询条件做的比较

    表达式含义

    HQL

    QBC

    大于等于

    >=

    Expression.ge()

    大于

    >

    Expression.gt()

    小于等于

    <=

    Expression.le()

    小于

    <

    Expression.lt()

    等于

    =

    Expression.eq()

    不等于

    <> 或者!=

    Expression.ne()

    为空

    is null

    Expression.isNull()

    不为空

    is notnull

    Expression.isNotNull()

    在指定范围内

    betweenand

    Expression.between()

    不在指定范围

    not betweenand

    Expression.not(Expression.between())

    属于某个集合

    in

    Expression.in()

    不属于某个集合

    notin

    Expression.not(Expression.in())

    and

    Expression.and()

    or

    Expression.or()

    not

    Expression.not()

    模糊查询

    like

    Expression.like()

  • 相关阅读:
    C程序中的raise和kill两个函数有何不同?
    修改目录proc下的tcp_tw_recycle报“只读文件系统”
    运行程序时报错“Value too large for defined data type”
    服务网格代理Envoy入门
    Docker入门之创建镜像初步
    联想笔记本上Ubuntu无线网卡问题
    Docker入门之安装Docker
    Python错误“ImportError: No module named MySQLdb”解决方法
    GLIBC中的库函数fflush究竟做了什么?
    Win10删除电脑3D对象等7个文件夹
  • 原文地址:https://www.cnblogs.com/a1280055207/p/2854405.html
Copyright © 2020-2023  润新知