/* 前提介绍:
* SQL: 查询的直接对象是数据库中的表(表的结构)--遵循的是国际数据库公共的标准
*
* HQL: 只属于Hibernate 这个ORM 框架,查询的对象不是数据库的表,而是表对应的持久化对象;---操作的是对象
*
* QBC: 只属于ORM框架,它是没有SQL出现的查询(动态查询),查询只存在对象操作上
* 特点:查询的范围有限,只能查询一定的范围,封装性比较好,没有SQL/HQL语句;
*
* Query : 1、是HQL语句的一个专用工具 2、通过该工具对具体的参数进行设置
* 注意:当查询语句添加条件的时候需要个对象添加别名
*
* 简单的提示:数据库中插入数据后进行commit;
*
* 难点:使用SQL进行表的关联查询;??????
*
* */
package com.svse.dao;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import com.svse.entity.TDept;
import com.svse.entity.TEmp;
import com.svse.util.HibernateSessionFactoryDaoSupportImpl;
//各种查询的测试
public class QueryDao extends HibernateSessionFactoryDaoSupportImpl
{
/*************************************HQL 查询*********************************************************/
/***
* 类型:位置参数查询--?
* 条件:查询性别为男的所有员工的信息
*/
public List findBySex(String sex){
List ar = new ArrayList();
/* 第一步:通过HQL语句创建Query对象 */
Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=?");
/* 第二步:设置参数值 ? 从 0 开始 */
query.setString(0, sex);
/* 第三步:获取集合数据 */
ar = query.list();
//简写
//ar = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=?").setString(0, sex).list();
/* 第四步:关闭 */
this.closeAll();
return ar;
}
/***
* 类型:占位符查询
* 条件:性别为男的所有员工信息,部门为研发部
*/
public List findEmpBySex_1(String sex,String dep){
//多写
List ar = new ArrayList();
Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=:sex and a.TDept.PName=:dep");
query.setString("sex", sex);
query.setString("dep",dep);
ar = query.list();
//简写
//ar = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=:sex").setString("sex", sex).list();
this.closeAll();
return ar;
}
/***
* 类型:查询部分字段
* 条件:查询所有
* 注意:因为HQL操作的是持久化对象,所有查询部分字段返回的是不完整的对象,因此返回的为Object对象的数组
*/
public List findSomeField(){
List ar = this.getSession().createQuery("select a.EName ,a.ESex from TEmp a").list();
this.closeAll();
return ar;
}
/***
* 类型:单一值的查询
* 条件:查询条数、最大值、最小值、平均值
*
*/
public double findUniqueValue(int type){
String hql = "";
switch (type)
{
case 1:
hql = "select count(*) from TEmp"; //查询行目总数
break;
case 2:
hql = "select max(EId) from TEmp";
break;
case 3:
hql = "select min(EId) from TEmp";
break;
case 4:
hql = "select avg(EId) from TEmp";
}
double value =Double.parseDouble( this.getSession().createQuery(hql).uniqueResult().toString());
this.closeAll();
return value;
}
/***
* 类型:模糊查询
* 条件:查询出名字中带‘小’的,并且是研发部的
*/
public List findEmpByLike(String term,String dept){
List ar = new ArrayList();
Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.EName like ? and a.TDept.PName=:dept");
query.setString(0, '%'+term+'%');
query.setString("dept",dept);
ar = query.list();
return ar;
}
/***************************************************************************************************/
/********************************************* QBC 查询 **************************************************/
/***
* 类型:QBC 带条件的查询
* 条件:性别为男的
*/
public List qbc_findEmpBySex(String sex){
List ar = new ArrayList();
/* 第一步:得到动态工具 */
Criteria criteria = this.getSession().createCriteria(TEmp.class);
/* 第二步:装载参数 ,直接对应实体属性
* Restrictions:限制,约束 */
criteria.add(Restrictions.eq("ESex", sex));
/* 表与表之间的关联 */
criteria.createCriteria("TDept");
/* 获得数据对象 */
ar = criteria.list();
//简写
//ar = this.getSession().createCriteria(TEmp.class).add(Restrictions.eq("ESex",sex)).createCriteria("TDept").list();
this.closeAll();
return ar;
}
/***
* 类型:QBC 的模糊查询
* 条件:名字中含有小的 ,研发部的
*/
public List qbc_findEmpLikeEname(String term,String dept){
List ar = this.getSession().createCriteria(TEmp.class).add(Restrictions.like("EName",term)).createCriteria("TDept").add(Restrictions.eq("PName",dept)).list();
this.closeAll();
return ar;
}
/***
* 类型:集合查询
* 条件:查总函数,查行数
*/
public double qbc_collection(){
double value = 0;
//获取工具
Criteria criteria = this.getSession().createCriteria(TEmp.class);
//设置参数后去行数
criteria.setProjection(Projections.rowCount());
//获取单一值
value = Double.parseDouble(criteria.uniqueResult().toString());
return value;
}
/***********************************************************************************/
/*******************************利用HQL进行数据的更改************************************************/
/***
* 类型:批量的更新数据
* 条件:将ID 为 1 的员工的名字改为:王八蛋
*/
public void upEmp(String term,int aim){
this.beginTransaction();
Query query = this.getSession().createQuery("update TEmp a set a.EName=? where a.EId =:aim");
query.setString(0,term);
query.setInteger("aim",aim);
query.executeUpdate();
this.commitTransaction();
}
/**
* 类型:执行SQL语句
*
*/
public void executeSQL(){
Query query = this.getSession().createSQLQuery("select * from t_emp a ,t_dept b where b.p_id = a.p_id").addEntity(TEmp.class);
List ar = query.list();
this.closeAll();
}
/**
* 类型:分页查询
* 条件:开始页数,每页最大的行数
* curPage:页码;
* lines:每页显示数据条数;
* ar_index:集合对应的索引;
* 解释:根据此规则实现页面分页效果,例如:达到每页 5 条数据,
* 首页: ar_index = (curPage-1)*5 == 0
* 第二页: ar_index = (curPage-1)*5 == 5
* 第三页: ar_index = (curPage-1)*5 == 10
* 。。。。。。
*/
public List queryForPages(int curPage,int lines){
Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept");
query.setFirstResult((curPage-1)*lines);
query.setMaxResults(lines);
List ar = query.list();
this.closeAll();
return ar;
}
/**
* @return 数据的总条数
*/
public int getCounts(){
int count = Integer.parseInt((this.getSession().createCriteria(TEmp.class).setProjection(Projections.rowCount()).uniqueResult().toString()));
this.closeAll();
return count;
}
public static void main(String[] args)
{
QueryDao dao = new QueryDao();
List ar = dao.queryForPages(1, 3);
System.out.println("*********************第一页*******************");
for (int i = 0; i <ar.size(); i++)
{
TEmp emp = (TEmp) ar.get(i);
System.out.print(emp.getEId()+" "+emp.getEName()+" "+emp.getTDept().getPName());
System.out.println();
}
System.out.println("*********************第二页*******************");
ar = dao.queryForPages(2, 3);
for (int i = 0; i <ar.size(); i++)
{
TEmp emp = (TEmp) ar.get(i);
System.out.print(emp.getEId()+" "+emp.getEName()+" "+emp.getTDept().getPName());
System.out.println();
}
}
}
分享到:
相关推荐
此外,优化查询,避免N+1查询问题,合理设计实体关系,都能有效提升Hibernate分页查询的效率。 总结起来,Hibernate的分页查询和数据库连接管理是其强大功能的重要组成部分。正确理解和使用这些特性,能够帮助...
1. 创建HQL查询:`String hql = "from Entity as e";` 2. 创建Query对象:`Query query = session.createQuery(hql);` 3. 设置分页参数:`query.setFirstResult(pageIndex * pageSize).setMaxResults(pageSize);` 4....
这里的关键点在于使用`createQuery`方法创建了一个HQL查询对象,并通过`setString`方法设置参数值,最后通过`list`方法执行查询并获取结果列表。 #### 三、分页查询 分页查询在处理大量数据时非常有用,可以有效地...
本篇主要围绕"Hibernate分页查询效果"这一主题,深入探讨如何利用Hibernate框架实现高效、便捷的分页功能。 首先,Hibernate是一个优秀的Java持久化框架,它提供了ORM(对象关系映射)解决方案,使得开发者可以使用...
Hibernate 支持多种方式来实现多表连接查询,包括 HQL(Hibernate Query Language)和 Criteria 查询。本项目主要关注 Criteria API 的使用,这是一种基于 Java 对象的查询方式,更加灵活且易于理解和维护。 **...
4. UserService实例调用UserDao的`getUser(int offset, int length)`方法,执行HQL查询。 5. 数据库返回结果,UserService封装成PageBean,返回给UserAction。 6. UserAction将PageBean传递给JSP页面,JSP页面解析并...
在这个类中,我们可以通过编写Hibernate HQL或SQL查询语句来实现分页查询。 4. **Struts2 Action** 在Action类中,我们需要处理来自用户的请求参数,如当前页码和每页显示记录数等,并调用DAO中的分页查询方法获取...
在"Struts+Hibernate分页及条件查询练习"这个项目中,开发者可能采用了以下步骤: 1. **配置Struts和Hibernate**:首先,需要在项目中引入Struts和Hibernate的相关库,配置Struts的struts-config.xml文件和...
### Hibernate 课件_HQL 知识点解析 #### HQL查询 ...这些知识点涵盖了HQL的基本概念、查询方法、各种高级查询技巧以及Session的管理等方面,希望能够帮助大家更好地理解和掌握Hibernate的HQL查询技术。
Hibernate查询语言(HQL)是Java开发者用于操作Hibernate ORM框架中的对象关系映射数据的一种强大的查询工具。HQL是面向对象的,它允许开发者用类名和属性而不是表名和列名来编写查询,极大地提高了代码的可读性和可...
这里使用了HQL(Hibernate Query Language)来执行查询。例如,在`getProductsMenuSub`方法中,通过以下HQL语句实现了连表查询: ```java String queryString = "select a.productsName from TopProducts as a, ...
- 在此案例中,可能使用了Hibernate的`Criteria`或`HQL`查询语言配合`PageRequest`或自定义分页实现,通过指定页码和每页大小来获取特定范围的数据。 6. **文件名:user** - "user"可能是数据库中的一个表名,...
**Hibernate分页查询** Hibernate支持两种分页方式:Criteria API和HQL(Hibernate Query Language)。Criteria API可以通过DetachedCriteria对象创建查询条件,然后调用setFirstResult和setMaxResults方法实现分页...
接下来,我们需要创建一个`Query`对象,该对象将执行具体的SQL或HQL查询。 ```java Query query = session.createQuery(sql); ``` 其中,`sql`变量代表我们要执行的SQL或HQL查询语句。 ##### 3.3 设置分页参数 ...
总结起来,"hibernate分页代码"是一个关于如何在Hibernate中进行分页查询的实践示例,适用于在MyEclipse环境下运行。通过Criteria API或HQL,开发者能够方便地实现分页功能,提升应用性能,为用户提供更好的体验。...
当我们想要实现模糊查询时,可以利用`Criteria` API或者`HQL`(Hibernate Query Language)来完成。例如,如果我们要查询一个名为`User`的实体类中所有名字包含"John"的用户,可以这样做: ```java Session session...
下面我们将深入探讨Hibernate的HQL模糊查询及其应用。 一、HQL概述 HQL是一种面向对象的查询语言,它的语法结构与SQL类似,但更关注于对象和实体,而不是数据库表和列。HQL允许开发者直接操作Java对象,避免了直接...
本篇文章将深入探讨如何结合Spring与Hibernate实现高效、灵活的组合查询以及分页功能,这对于提升Web应用程序的性能和用户体验至关重要。 首先,Spring框架是一个全面的Java企业级应用开发框架,它提供了依赖注入...
除了Criteria查询,还可以使用HQL(Hibernate Query Language)进行分页查询,HQL是Hibernate提供的面向对象的查询语言,语法类似SQL。以下是一个使用HQL分页查询的例子: ```java String hql = "from User"; Query...
`queryForPage` 方法通过`getHibernateTemplate().executeFind()`方法执行HQL查询,并利用`HibernateCallback`接口回调来设置查询的起始位置和最大结果数,从而实现分页。`getAllRowCount` 方法则直接返回HQL查询后...