Hibernate通常是三种:hql查询,QBC查询和QBE查询:

简介: 一:Hibernate QBC与HQL优缺点QBC 全称:Query By CriteriaHQL 全称:hibernate Query LanguageHQL优点:与sql相近,可读性好,功能强大,效率高。

一:Hibernate QBC与HQL优缺点

QBC 全称:Query By Criteria

HQL 全称:hibernate Query Language

HQL优点:与sql相近,可读性好,功能强大,效率高。

HQL缺点:字符串形式,只有在运行时才被解析,扩展性差。

QBC优点:提供面向对象的接口,编译时就可被解析,便于排错调试,扩展性好,允许用户扩展Criteria接口.

QBC缺点:可读性差,功能没有HQL强大,不支持报表查询和子查询。

三:

hibernate 查询match mode的四种模式

 

MatchMode.START:字符串在最前面的位置.相当于"like 'key%'"
MatchMode.END:字符串在最后面的位置.相当于"like '%key'"
MatchMode.ANYWHERE:字符串在中间匹配.相当于"like '%key%'"
MatchMode.EXACT:字符串精确匹配.相当于"like 'key'"


三:通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询:

1、QBE(Qurey By Example)检索方式
QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配。在这种情况下,还是采用HQL检索方式或QBC检索方式。
Java代码  
  
public Pager findPageByExample(int pageNo, int pageSize, Object object)   
{   
    Pager pager = null;   
    try  
    {   
        Criteria criteria = this.getSession().createCriteria(   
                Class.forName(this.getEntity()));   
  
        if (object != null)   
        {   
            criteria.add(Example.create(object).enableLike());   
        }   
  
        // 获取根据条件分页查询的总行数   
        int rowCount = (Integer) criteria.setProjection(   
                Projections.rowCount()).uniqueResult();   
        criteria.setProjection(null);   
  
        criteria.setFirstResult((pageNo - 1) * pageSize);   
        criteria.setMaxResults(pageSize);   
  
        List result = criteria.list();   
  
        pager = new Pager(pageSize, pageNo, rowCount, result);   
  
    } catch (RuntimeException re)   
    {   
        throw re;   
    } finally  
    {   
        return pager;   
    }   
  
}  


注意代码的第20行,即criteria.add(Example.create(object).enableLike());这一行,需将Example.create(object)调用.enableLike()方法,不然不能模糊查询。
在BO层将需要模糊查询的列用"%%"串起来,不然仍然和"="一样。
BO层代码:
Java代码  
  
public Pager getInfoByQuery(int pageNo, int pageSize, String mendName,   
        String specialty, String post)   
{   
  
    EicMend eicMend = new EicMend();   
    if (mendName != null && mendName.length() > 0)   
    {   
        eicMend.setMendname("%" + mendName + "%");   
    }   
    if (specialty != null && specialty.length() > 0)   
    {   
        eicMend.setSpecialty(specialty);   
    }   
    if (post != null && post.length() > 0)   
    {   
        eicMend.setPost(post);   
    }   
  
    Pager pager = erpManagerDao   
            .findPageByExample(pageNo, pageSize, eicMend);   
    return pager;   
}  


执行SQL语句如下:
Sql代码  
Hibernate: select count(*) as y0_ from YJZX.EIC_MEND this_ where    
(this_.MENDNAME like ? and this_.POST like ?)   
  
Hibernate: select * from ( select this_.MENDID as MENDID23_0_, ……   
this_.EXPERTREMARK as EXPERTR28_23_0_ from YJZX.EIC_MEND this_ where    
(this_.MENDNAME like ? and this_.POST like ?) ) where rownum <= ?  


所以只需将需模糊查询的列用“%%”链接即可。


2、QBC(Qurey By Criteria)检索方式
       采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Restrictions接口组成,它支持在运行时动态生成查询语句。比较常见的是两种传参方式:一种是用map传参,另一种是用Criterion…不定参数传参。
Map传参方式范例如下:
DAO层:
Java代码  
  
public Pager findPageByCriteria(int pageNo, int pageSize, Map map)   
{   
    Pager pager = null;   
    try  
    {   
        Criteria criteria = this.getSession().createCriteria(   
                Class.forName(this.getEntity()));   
  
        if (map != null)   
        {   
            Set<String> keys = map.keySet();   
            for (String key : keys)   
            {   
                criteria.add(Restrictions.like(key, map.get(key)));   
            }   
        }   
  
        // 获取根据条件分页查询的总行数   
        int rowCount = (Integer) criteria.setProjection(   
                Projections.rowCount()).uniqueResult();   
        criteria.setProjection(null);   
  
        criteria.setFirstResult((pageNo - 1) * pageSize);   
        criteria.setMaxResults(pageSize);   
  
        List result = criteria.list();   
  
        pager = new Pager(pageSize, pageNo, rowCount, result);   
  
    } catch (RuntimeException re)   
    {   
        throw re;   
    } finally  
    {   
        return pager;   
    }   
  
}  


Map传参方式对应BO层代码:
Java代码  
  
public Pager getInfoByQuery2(int pageNo, int pageSize, String mendName,   
        String specialty, String post)   
{   
  
    Map map = new HashMap();   
  
    if (mendName != null && mendName.length() > 0)   
    {   
        map.put("mendname", "%" + mendName + "%");   
    }   
    if (specialty != null && specialty.length() > 0)   
    {   
        map.put("specialty", specialty);   
    }   
    if (post != null && post.length() > 0)   
    {   
        map.put("post", post);   
    }   
  
    Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize, map);   
    return pager;   
}  


第二种方式:Criterion…不定参数传参方式。其代码如下所示:
DAO层代码:
Java代码  
  
public Pager findPageByCriteria(int pageNo, int pageSize,   
        Criterion... criterions)   
{   
    Pager pager = null;   
    try  
    {   
        Criteria criteria = this.getSession().createCriteria(   
                Class.forName(this.getEntity()));   
        if (criterions != null)   
        {   
            for (Criterion criterion : criterions)   
            {   
                if (criterion != null)   
                {   
                    criteria.add(criterion);   
                }   
  
            }   
        }   
  
        // 获取根据条件分页查询的总行数   
        int rowCount = (Integer) criteria.setProjection(   
                Projections.rowCount()).uniqueResult();   
        criteria.setProjection(null);   
  
        criteria.setFirstResult((pageNo - 1) * pageSize);   
        criteria.setMaxResults(pageSize);   
  
        List result = criteria.list();   
  
        pager = new Pager(pageSize, pageNo, rowCount, result);   
  
    } catch (RuntimeException re)   
    {   
        throw re;   
    } finally  
    {   
        return pager;   
    }   
  
}  


Criterion…不定参数传参方式对应BO层代码:
Java代码  
  
public Pager getInfoByQuery3(int pageNo, int pageSize, String mendName,   
        String specialty, String post)   
{   
    Criterion criterion1 = null, criterion2 = null, criterion3 = null;   
    if (mendName != null && mendName.length() > 0)   
    {   
        criterion1 = Restrictions.ilike("mendname", mendName,   
                MatchMode.ANYWHERE);   
    }   
  
    if (specialty != null && specialty.length() > 0)   
    {   
        criterion2 = Restrictions.ilike("specialty", specialty,   
                MatchMode.EXACT);   
    }   
  
    if (post != null && post.length() > 0)   
    {   
        criterion3 = Restrictions.ilike("post", post, MatchMode.EXACT);   
    }   
  
    Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize,   
            criterion1, criterion2, criterion3);   
  
    return pager;   
}  


3、HQL检索方式


HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相识。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。
使用Query接口分页查询DAO代码:
Java代码  
  
public List<Object> findPageByQuery(int pageNo, int pageSize, String hql,   
        Map map)   
{   
    List<Object> result = null;   
    try  
    {   
        Query query = this.getSession().createQuery(hql);   
  
        Iterator it = map.keySet().iterator();   
        while (it.hasNext())   
        {   
            Object key = it.next();   
            query.setParameter(key.toString(), map.get(key));   
        }   
  
        query.setFirstResult((pageNo - 1) * pageSize);   
        query.setMaxResults(pageSize);   
  
        result = query.list();   
  
    } catch (RuntimeException re)   
    {   
        throw re;   
    }   
    return result;   
}  


查询所有记录数的DAO代码:
Java代码  
  
public int getTotalCount(String hql, Map map)   
{   
    try  
    {   
        Query query = this.getSession().createQuery(hql);   
  
        Iterator it = map.keySet().iterator();   
        while (it.hasNext())   
        {   
            Object key = it.next();   
            query.setParameter(key.toString(), map.get(key));   
        }   
  
        Integer i = (Integer) query.list().get(0);   
        return i;   
    } catch (RuntimeException re)   
    {   
        throw re;   
    }   
  
}  


BO层代码:
Java代码  
  
public Pager getInfoByQuery(int pageNo, int pageSize, String expertName,   
        String expertSpecialty, String post)   
{   
    StringBuffer hql = new StringBuffer();   
    hql.append("select count(expertid) from EicExpert where 1=1 ");   
  
    Map map = new HashMap();   
  
    if (expertName != null && expertName.length() > 0)   
    {   
        map.put("expertname", "%" + expertName + "%");   
        hql.append("and expertname like :expertname ");   
    }   
    if (expertSpecialty != null && expertSpecialty.length() > 0)   
    {   
        map.put("expertspecialty", expertSpecialty);   
        hql.append("and expertspecialty like :expertspecialty ");   
    }   
    if (post != null && post.length() > 0)   
    {   
        map.put("post", post);   
        hql.append("and post like :post ");   
    }   
  
    String queryHql = hql.substring(22);   
    List result = erpManagerDao.findPageByQuery(pageNo, pageSize,   
            queryHql, map);   
    int rowCount = erpManagerDao.getTotalCount(hql.toString(), map);   
  
    Pager pager = new Pager(pageSize, pageNo, rowCount, result);   
    return pager;   

}  







相关文章
|
2月前
|
SQL 数据库 Java
HQL vs SQL:谁将统治数据库查询的未来?揭秘Hibernate的神秘力量!
【8月更文挑战第31天】Hibernate查询语言(HQL)是一种面向对象的查询语言,它模仿了SQL的语法,但操作对象为持久化类及其属性,而非数据库表和列。HQL具有类型安全、易于维护等优点,支持面向对象的高级特性,内置大量函数,可灵活处理查询结果。下面通过示例对比HQL与SQL,展示HQL在实际应用中的优势。例如,HQL查询“从员工表中筛选年龄大于30岁的员工”只需简单地表示为 `FROM Employee e WHERE e.age &gt; 30`,而在SQL中则需明确指定表名和列名。此外,HQL在处理关联查询时也更为直观易懂。然而,对于某些复杂的数据库操作,SQL仍有其独特优势。
39 0
|
2月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
67 0
|
2月前
|
SQL Java 数据库连接
|
2月前
|
缓存 Java 数据库连接
什么是 Hibernate 查询语言或 HQL?
【8月更文挑战第21天】
68 0
|
2月前
|
SQL Java 数据库连接
在 Hibernate 中何时使用条件查询?
【8月更文挑战第21天】
28 0
|
5月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
2月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
37 1
|
2月前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
41 0
|
3月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
53 0
|
4月前
|
Java 数据库连接 数据库
探索JPA生态:Hibernate与其他ORM框架的对比分析
【6月更文挑战第25天】**JPA标准下的Hibernate是流行的ORM实现,提供丰富功能如二级缓存和延迟加载,但其学习曲线较陡,性能优化复杂。相比如MyBatis,Hibernate的JPQL更面向对象,MyBatis则接近SQL。选择ORM需考虑项目需求和个人偏好。**
63 0