1: QBE (Query By Example)
Criteria cri = session.createCriteria(Student.class);
cri.add(Example.create(s)); //s是一个 Student 对象
list cri.list();
实质:创建一个模版,比如我有一个表serial 有一个 giftortoy 字段,我设置 serial.setgifttoy(\"2\"),
则这个表中的所有的giftortoy 为 2 的数据都会出来
QBC查询方式
QBC(Query By Criteria)查询方式是 Hibernate 提供的 “ 更加面向对象 ” 的一种检索方式。 QBC 在条件查询上比 HQL 查询更为灵活,而且支持运行时动态生成查询语句。
在Hibernate 应用中使用 QBC 查询通常经过 3 个步骤
(1)使用 Session 实例的 createCriteria() 方法创建 Criteria 对象
(2)使用工具类 Restrictions 的相关方法为 Criteria 对象设置查询对象
(3)使用 Criteria 对象的 list() 方法执行查询,返回查询结果
Restrictions类的常用方法
Restrictions.eq(String propertyName,Object value)
等于
Restrictions.allEq(Map propertyNameValues)
使用Map key/value 进行多个等于的比对
Restrictions.gt(String propertyName, Object value)
大于 > (gt----->greater than)
Restrictions.ge(String propertyName, Object value)
大于等于 >= (ge----->greater equal)
Restrictions.It(String propertyName, Object value)
小于< (It---->less than)
Restrictions.Le(String propertyName, Object value)
小于等于<= (le---->less equal)
Restrictions.between(String propertyName, Object lo, Object hi)
对应SQL 语句的 Between 子句
Restrictions.like(String propertyName, Object value)
对应SQL 语句的 LIKE 子句
Restrictions.in(String propertyName, Collection value)
对应SQL 语句的 in 子句
Restrictions.and(Criterion lhs, Criterion rhs)
And关系
Restrictions.or(Criterion lhs, Criterion rhs)
Or关系
Restrictions.sqlRestriction(String sql,Object[] values,Type[] types)
SQL限定查询
工具类Order 提供设置排序方式
Order.asc(String propertyName)
升序排序
Order.desc(String propertyName)
降序排序
工具类Projections 提供对查询结果进行统计与分组操作
Porjections.avg(String propertyName)
求某属性的平均值
Projections.count(String propertyName)
统计某属性的数量
Projections.countDistinct(String propertyName)
统计某属性的不同值的数量
Projections.groupProperty(String propertyName)
指定一组属性值
Projections.max(String propertyName)
某属性的最大值
Projections.min(String propertyName)
某属性的最小值
Projections.projectionList()
创建一个新的projectionList 对象
Projections.rowCount()
查询结果集中记录的条数
Projections.sum(String propertyName)
返回某属性值的合计
QBE查询
QBE查询就是检索与指定样本对象具有相同属性值的对象。因此 QBE 查询的关键就是样本对象的创建,样本对象中的所有非空属性均将作为查询条件。 QBE 查询的功能子集,虽然 QBE 没有 QBC 功能大,但是有些场合 QBE 使用起来更为方便。
工具类Example 为 Criteria 对象指定样本对象作为查询条件
Java代码
1 Session session = HibernateSessionFactory.getSessionFactory().openSession();
2 Transaction ts = session.beginTransaction();
3 Customer c = new Customer();
4 c.setCname("Hibernate");
5 Criteria criteria = session.createCriteria(Customer. class );
6 Criteria.add(Example.create(c));
7 Iterator it = criteria.list().iterator();
8 ts.commit();
9 HibernateSessionFactory.closeSession();
QBC分页查询
Criteria为我们提供了两个有用的方法: setFirstResult(int firstResult) 和 setMaxResults(int maxResults).
setFirstResult(int firstResult)方法用于指定从哪一个对象开始检索(序号从 0 开始),默认为第一个对象(序号为 0 ); setMaxResults(int maxResults) 方法用于指定一次最多检索出的对象数目,默认为所有对象。
Java代码
1 Session session = HibernateSessionFactory.getSessionFactory().openSession();
2 Transaction ts = null ;
3 Criteria criteria = session.createCriteria(Order. class );
4 int pageSize = 15;
5 int pageNo = 1;
6 criteria.setFirstResult((pageNo-1)*pageSize);
7 criteria.setMaxResults(pageSize);
8 Iterator it = criteria.list().iterator();
9 ts.commit();
10 HibernateSessionFactory.closeSession();
QBC复合查询
复合查询就是在原有的查询基础上再进行查询。例如在顾客对定单的一对多关系中,在查询出所有的顾客对象后,希望在查询定单中money 大于 1000 的定单对象
DetachedCriteria criteria= DetachedCriteria . forClass (Model. class );
criteria.add(Restrictions. eq ( "userid" , userid));
criteria.add(Restrictions. eq ( "state" , false ));
criteria.add(Restrictions. not ( Expression . eq ( "freeze" , false ) ));
criteria.addOrder( Order. desc ( "createtime" ) );
return modelDAO .findByCriteria(criteria);
Java代码
1 Session session = HibernateSessionFactory.getSessionFactory().openSession();
2 Transaction ts = session.beginTransaction();
3 Criteria cuscriteria = session.createCriteria(Customer. class );
4 Criteria ordCriteria = cusCriteria.createCriteria("orders");
5 ordCriteria.add(Restrictions.gt("money", new Double(1000)));
6 Iterator it = cusCriteria.list().iterator();
7 ts.commit();
8 HibernateSessionFactory.closeSession();
QBC离线查询
离线查询又叫DetachedCriteria 查询,它可以在 Session 之外进行构造,只有在需要执行查询时才与 Session 绑定。
2: QBC (Query By Criteria) 主要有 Criteria,Criterion,Oder,Restrictions 类组成
session = this.getSession();
Criteria cri = session.createCriteria(JdItemSerialnumber.class);
Criterion cron = Restrictions.like(\"customer\",name);
cri.add(cron);
list = cri.list();
==============================
比较运算符
HQL运算符 QBC 运算符 含义
= Restrictions.eq() 等于
<> Restrictions.not(Exprission.eq()) 不等于
> Restrictions.gt() 大于
>= Restrictions.ge() 大于等于
< Restrictions.lt() 小于 [Page]
<= Restrictions.le() 小于等于
is null Restrictions.isnull() 等于空值
is not null Restrictions.isNotNull() 非空值
like Restrictions.like() 字符串模式匹配
and Restrictions.and() 逻辑与
and Restrictions.conjunction() 逻辑与
or Restrictions.or() 逻辑或
or Restrictions.disjunction() 逻辑或
not Restrictions.not() 逻辑非
in(列表 ) Restrictions.in() 等于列表中的某一个值 [Page]
ont in(列表 ) Restrictions.not(Restrictions.in()) 不等于列表中任意一个值
between x and y Restrictions.between() 闭区间 xy 中的任意值
not between x and y Restrictions.not(Restrictions..between()) 小于值 X 或者大于值 y
3: HQL
String hql = \"select s.name ,avg(s.age) from Student s group by s.name\";
Query query = session.createQuery(hql);
list = query.list();
....
4: 本地 SQL 查询
session = sessionFactory.openSession();
tran = session.beginTransaction();
SQLQuery sq = session.createSQLQuery(sql);
sq.addEntity(Student.class);
list = sq.list();
tran.commit();
5: QID
Session的 get() 和 load() 方法提供了根据对象 ID 来检索对象的方式。该方式被用于事先知道了要检索对象 ID 的情况。
Hibernate: HQL/QBC 查询语言比较的用法
Hib的检索方式 1 、导航对象图检索方式。通过已经加载的对象,调用 .iterator() 方法可以得到 order 对象如果是首次执行此方法, Hib 会从数据库加载关联的 order 对象,否则就从缓存中得到。 2 、 OID 检索方式。通过 session 的 get , load 方法知道了 OID 的情况下可以使用 3 、 HQL 检索方
Hib的检索方式
1、导航对象图检索方式。通过已经加载的对象,调用 .iterator() 方法可以得到 order 对象如果是首次执行此方法, Hib 会从数据库加载关联的 order 对象,否则就从缓存中得到。
2、 OID 检索方式。通过 session 的 get , load 方法知道了 OID 的情况下可以使用
3、 HQL 检索方式。使用面向对象的 HQL 查询语句 session 的 find 方法利用 HQL 来查询
4、 QBC 检索方式。利用 QBCAPI 来检索它是封装了基于字符串的查询语句
5、本地的 SQL 检索方式。使用本地数据库的 SQL 查询语句 Hib 会负责把检索到的 JDBC 结果集映射为持久化对象图。
五种检索方式的使用场合和特点:
HQL : 是面向对象的查询语言,同 SQL 有些相似是 Hib 中最常用的方式。
查询设定各种查询条件。
支持投影查询,检索出对象的部分属性。
支持分页查询,允许使用having 和 group by
提供内制的聚集函数,sum() , min() , max()
能调用用户的自定义SQL
支持子查询,嵌入式查询
支持动态绑定参数
建议使用Query 接口替换 session 的 find 方法。
Query Q = session.createQuery("from customer as c where c.name = :customerName" +"and c.age = :customerAge");
query.setString("customerName" , "tom");
query.setInteger("customerAge" , "21");
list result = query.list();
QBC : QBCAPI提供了另一种方式,主要是 Criteria 接口、 Criterion 接口和 Expression 类
Criteria criteria = session.createCriteria(customer.class);
Criterion criterion1 =Expression.like("name","t%");
Criterion criterion2 =Expression.eq("age",new Integer(21));
Critera = criteria.add(criterion1) ;
Critera = criteria.add(criterion2) ;
list result = criteria.list();
或是: list result = session.createCriteria(Customer.class).add(Expression.eq("this.name","tom")).list();
SQL : 采用 HQL 和 QBC 检索时, Hib 生成 SQL 语句适用所有数据库。
Query query =session.createSQLQuery("select {c.*} from customers c where c.name like : customername " + "and c.age =:customerage","c",customer.calss);
query.setString("customername","tom");
query.setInteger("customerage","21");
list result = query.list();
/////////////多态查询
HQL : session.createQuery("from employee");
QBC : session.createCriteria(employee.class);
HQL : session.createQuery("from hourlyEmployee");
QBC : session.createCriteria(hourlyEmployee.class);
下面的HQL 查询语句将检索出所有的持久化对象:
from java.lang.Object ;
from java.io.serializable ;
////////////查询的排序
1、查询结果按照客户姓名升序排列:
HQL :
Query query = session.createQuery
("from customer c order by c.name");
QBC :
Criteria criteria = session.createCriteria(customer.class);
criteria.addOrder(order.asc("name"));
HQL :
Query query = session.createQuery("from customer c orderby c.name asc , c.age desc");
QBC :
Criteria criteria =session.createCriteria(customer.class);
criteria.addOrder(order.asc ("name"));
criteria.addOrder(order.desc("age"));
import net.sf.hibernate.pression.Order
import mypack.Order
...........
Criteria criteria = session.createCritria (mypack.Order.class);
criteria.addOrder(net.sf.hibernate.Order.asc("name"));
///////////HQL语句的参数绑定 Query 接口
提供了绑定各种Hib 映射类型的方法。
setBinary()
setString()
setBoolean()
setByte()
setCalendar()
setCharacter()
setDate()
setDouble()
setText()
setTime()
setTimestamp()
setEntity()
//把参数与一个持久化类的事例绑定
lsit result = session.createQuery
("from order o where o.customer = :customer").setEntity("customer" , customer).list ;
setParameter()
//绑定任意类型的参数
setProperties()
//把命名参数与一个对象的属性值绑定
Query query = session.createQuery
("from customer c where c.name =:name " + "and c.age =:age" );
Query.setProperties(customer);
public AlBasic queryAlBasicByEtpsIdAndAnnlYear(String entityName, String etpsId, String annlYear) {
if (etpsId == null || "".equals(etpsId) || annlYear == null || "".equals(annlYear))
return null;
DetachedCriteria dc = DetachedCriteria.forEntityName(entityName);
dc.add(Restrictions.eq("etpsId", etpsId));
dc.add(Restrictions.eq("annlYear", annlYear));
List result = findByCriteria(dc);
if (result == null || result.size() == 0) {
return null;
}
return (AlBasic) result.get(0);
}
分享到:
相关推荐
**Hibernate查询方法大全** Hibernate,作为Java领域中最流行的持久化框架之一,提供了多种查询数据的方法。这些方法使得开发者能够高效地从数据库中检索、更新和删除数据,无需编写大量SQL语句。本篇文章将深入...
【Hibernate查询方法之探析】 Hibernate作为一款强大的Java持久化框架,提供了多种查询方式来适应不同的数据检索需求。本文将深入解析五种主要的Hibernate查询方法:QBE(Query By Example)、QBC(Query By ...
本篇文章将深入探讨通用的Hibernate查询方法,特别是关于分页查询的应用。 在Hibernate中,查询数据主要通过Criteria、HQL(Hibernate Query Language)和Query API三种方式。首先,让我们来看看Criteria查询。...
总的来说,这份“小码哥Hibernate封装的查询方法的皮毛介绍”会涵盖Hibernate查询的基础知识和实践技巧,对于想要提升Java后端开发能力的程序员来说是一份宝贵的资料。通过深入学习和实践,可以提高数据库操作的效率...
Spring Boot JPAHibernate查询方法 Spring Data JPA是提供各种API来执行CRUD操作的Spring Data模块之一.Spring Data JPA主要用于存储库层的开发。 在Spring Data中,我们可以定义存储库接口和方法来检索数据。 所有...
根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### Hibernate 连表查询基础 Hibernate 是一个开源的对象关系映射(ORM)...
### Struts+Hibernate查询所有记录 #### 一、概述 在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有...
### Hibernate查询解决方案详解 #### 一、概述 Hibernate 是一个开放源代码的 ORM(对象关系映射)框架,它提供了从 Java 类到数据库表的映射机制,以及数据的查询和获取方式。Hibernate 的核心功能之一是提供了...
总结,Hibernate提供多种方式查询数据表中的字段,包括HQL、Criteria API和DetachedCriteria,选择合适的方法取决于具体需求。正确理解和使用Hibernate,能够大大提高Java开发中的数据库操作效率。
在描述中提到的问题是,当使用DWR调用Hibernate查询方法时,控制台显示了大量的SQL语句,导致性能下降。这通常是由Hibernate的延迟加载机制失效引起的。延迟加载意味着关联的对象或集合只在真正需要时才进行数据库...
一个超好用的Hibernate查询工具类通常会封装一些常见的查询方法,例如根据ID获取单个对象、根据条件获取对象列表、分页查询等。这样的工具类可以大大减少代码重复,提高代码的可读性和可维护性。 以下是一些可能...
### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理...
本篇将详细探讨"Hibernate参数查询通用方法"这一主题,以及如何通过Dao层实现高效、灵活的数据查询。 在Hibernate中,参数查询通常涉及到HQL(Hibernate Query Language)或者使用Criteria API。这两种方式都可以...
让我们详细了解一下`HibernateSessionFactory`类中的关键方法和其背后的原理。 1. **配置和初始化SessionFactory** `HibernateSessionFactory`类通过`cfg.configure(CONFIG_FILE_LOCATION)`来读取配置文件(默认为...
Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...
- **读取(Read)**:用户发起查询请求,Action根据请求参数构建查询条件,调用Hibernate查询方法,然后将查询结果封装到模型对象中,传递给视图进行显示。 - **更新(Update)**:用户编辑数据并提交,Action接收并...
### Hibernate的查询方式详解 #### 引言 Hibernate作为Java领域中最流行的ORM(Object-Relational Mapping)框架之一,提供了一系列高效、灵活的查询机制,旨在桥接对象模型与关系数据库之间的鸿沟。本文将深入...
hibernate查询详解 在Java开发中,Hibernate作为一款强大的ORM(Object-Relational Mapping)框架,极大地简化了数据库操作。本文将详细介绍Hibernate的五种查询方式,包括HQL查询、Criteria方法、动态查询...
本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...
本篇文章将深入探讨如何使用Hibernate实现模糊查询和分页功能,这对于任何需要处理大量数据的应用程序来说都是至关重要的技能。 首先,让我们了解Hibernate的核心概念。Hibernate是一个开源的JPA(Java Persistence...