您的位置:首页 > 数据库

Hibernate中的查询:HQL、Criteria、原生SQl

2017-04-28 18:10 471 查看
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装

Hibernate数据查询:

  1、Hibernate Query Language(HQL)

  2、Criteria Query(Criteria )

  3、Native SQL(原生SQl)

工具类以及数据库的设计

开发工具:MyEclipse10

数据库:MySQl

Hibernate版本:4.0

Demo架构截图:



其中domain包下以及hibernate.cfg.xml为自动生成文件。自动生成方法请观看:

http://blog.csdn.net/u012561176/article/details/45919751#comments

HibernateUtils.java代码:用于生产Session对象

public class HibernateUtils {

public static SessionFactory sf;

// 保证类加载时就执行一次(保证SessionFactory只存在一个)
static {
Configuration cf = new Configuration();
cf.configure();
sf = cf.buildSessionFactory();
}

public static Session getCurrentSession() {
return sf.getCurrentSession();

}

public static Session getOpenSession() {
return sf.openSession();
}
}


数据库设计:





HQL查询

HQL(Hibernate Query Language)提供更加丰富灵活、更为强大的查询能力。

4000
我将HQL查询分为4类:

  1、基础查询

  2、(条件查询)问号占位符

  3、(条件查询)命名占位符

  4、分页查询

用户可以根据自己的喜爱自行选择

public class HQLTest {

/**
* 基础查询
*/
@Test
public void fun() {
Session session = HibernateUtils.getOpenSession();
// 获取事务
Transaction tran = session.beginTransaction();

// Stuinfo不是数据库表名,而是实例化数据库的类的名称,
// 可以写类的全类名,或者直接写类名(一个项目中只存在一个此类名)
String hql = "from Stuinfo";
// 根据hql查询
Query query = session.createQuery(hql);
// 获取结果的集合(自动封装成Stuinfo对象)
List<Stuinfo> list = query.list();
// Stuinfo stuinfo = (Stuinfo) query.uniqueResult(); 查询单个对象
System.out.println(list.toString());

// 提交事务
tran.commit();
// 关闭session(养成良好的习惯)
session.close();
}

/**
* (条件查询)问号占位符
*/
@Test
public void fun2() {
Session session = HibernateUtils.getOpenSession();
Transaction tran = session.beginTransaction(); // 获取事务

/*
* 此语句中的id不是数据库表中的列名,而是表所对应的类的属性名
*/
String hql = "from Stuinfo where id = ?";
Query query = session.createQuery(hql); // 根据hql查询
// query.setInteger(0, 1); // 设置参数,参一:问号占位符的下标(从0开始),参二:问号的值
query.setParameter(0, 1); // 与上一行代码意义相同,(通用写法不用担心类型不匹配)
List<Stuinfo> list = query.list(); // 获取结果的集合(自动封装成Stuinfo对象)
System.out.println(list.toString());

tran.commit(); // 提交事务
session.close(); // 关闭session(养成良好的习惯)
}

/**
* 命名占位符
*/
@Test
public void fun3() {
Session session = HibernateUtils.getOpenSession();
Transaction tran = session.beginTransaction(); // 获取事务
/*
* 此语句中的id不是数据库表中的列名,而是表所对应的类的属性名
*/
String hql = "from Stuinfo where id= :id";
Query query = session.createQuery(hql); // 根据hql查询
query.setParameter("id", 1); // 设置参数,参一:问号占位符的下标(从0开始),参二:问号的值
List<Stuinfo> list = query.list(); // 获取结果的集合(自动封装成Stuinfo对象)
System.out.println(list.toString());

tran.commit(); // 提交事务
session.close(); // 关闭session(养成良好的习惯)
}

/**
* 分页查询
*/
@Test
public void fun4() {
// 1 获得session
Session session = HibernateUtils.getOpenSession();
// 2 控制事务
Transaction tx = session.beginTransaction();
// 3执行操作
// -------------------------------------------
// 1> 书写HQL语句
String hql = " from Stuinfo"; // 查询所有Customer对象
// 2> 根据HQL语句创建查询对象
Query query = session.createQuery(hql);
// 设置分页信息 limit ?,?
query.setFirstResult(0);
query.setMaxResults(1);
// 3> 根据查询对象获得查询结果
List<Stuinfo> list = query.list();
System.out.println(list);
// -------------------------------------------
// 4提交事务.关闭资源
tx.commit();
session.close();// 游离|托管 状态, 有id , 没有关联

}
}


Criteria查询

Criteria是一种比hql更面向对象的查询方式。Criteria 可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式,Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode。

我将HQL查询分为3类:

  1、基础查询

  2、条件查询

  3、分页查询

用户可以根据自己的喜爱自行选择

/**
* 面向对象的无语句SQl查询
*
* @author LX
*/
public class CriteriaTest {

/**
* Criteria基础查询
*/
@Test
public void fun1() {
Session session = HibernateUtils.getOpenSession();
Transaction tran = session.beginTransaction();

// 查询所有的Stuinfo对象
Criteria criteria = session.createCriteria(Stuinfo.class);
List<Stuinfo> list = criteria.list();
System.out.println(list.toString());
tran.commit();
session.close();
}

// Criteria条件查询
// sql常用操作符 Restrictions的方法
// > gt
// >= ge
// < lt
// <= le
// == eq
// != ne
// in in
// between and between
// like like
// is not null isNotNull
// is null isNull
// or or
// and and
@Test
public void fun2() {
Session session = HibernateUtils.getOpenSession();
Transaction tran = session.beginTransaction();

// 查询所有的Stuinfo对象
Criteria criteria = session.createCriteria(Stuinfo.class);
// 添加查询参数
criteria.add(Restrictions.eq("id", 1));
// 执行查询获得结果
Stuinfo info = (Stuinfo) criteria.uniqueResult();
System.out.println(info.toString());
tran.commit();
session.close();
}

/**
* 分页查询
*/
@Test
public void fun3() {
// 1 获得session
Session session = HibernateUtils.getOpenSession();
// 2 控制事务
Transaction tx = session.beginTransaction();
// 3执行操作
// -------------------------------------------
// 创建criteria查询对象
Criteria criteria = session.createCriteria(Stuinfo.class);
// 设置分页信息 limit ?,?
criteria.setFirstResult(0);
criteria.setMaxResults(1);
// 执行查询
List<Stuinfo> list = criteria.list();
System.out.println(list);
// -------------------------------------------
// 4提交事务.关闭资源
tx.commit();
session.close();// 游离|托管 状态, 有id , 没有关联

}

@Test
// 查询总记录数
public void fun4() {
// 1 获得session
Session session = HibernateUtils.getOpenSession();
// 2 控制事务
Transaction tx = session.beginTransaction();
// 3执行操作
// -------------------------------------------
// 创建criteria查询对象
Criteria criteria = session.createCriteria(Stuinfo.class);
// 设置查询的聚合函数 => 总行数
criteria.setProjection(Projections.rowCount());
// 执行查询
Integer count = (Integer) criteria.uniqueResult();
System.out.println(count);
// -------------------------------------------
// 4提交事务.关闭资源
tx.commit();
session.close();// 游离|托管 状态, 有id , 没有关联

}
}


Native SQL(原生SQl)查询

Native SQL允许你针对数据库来使用原生的SQL,这些SQL可能是标准的SQL,也可以是某数据库特定的SQL。如果使用database-specific SQL语句,则数据库不能更换,否则请使用Open SQL。

我将HQL查询分为3类:

  1、基础查询

  2、基础查询 (将结果封装到对象中)

  3、条件查询

  4、分页查询

用户可以根据自己的喜爱自行选择

/**
* 原生的sql查询
*
* @author LX
*/
public class ProtosomaticSQLTest {

/**
* 基础查询
*/
@Test
public void fun1() {
Session session = HibernateUtils.getOpenSession();
Transaction tran = session.beginTransaction();

String sql = "select * from stuinfo";
SQLQuery query = session.createSQLQuery(sql);
List<Object[]> list = query.list();

for (Object[] obj : list) {
System.out.println(Arrays.toString(obj));
}
tran.commit();
session.close();
}

/**
* 基础查询 (将结果封装到对象中)
*/
@Test
public void fun2() {
Session session = HibernateUtils.getOpenSession();
Transaction tran = session.beginTransaction();
String sql = "select * from stuinfo";
// 创建查询对象
SQLQuery query = session.createSQLQuery(sql);
// 将结果集封装到对象中
query.addEntity(Stuinfo.class);
List<Stuinfo> list = query.list();
System.out.println(list.toString());
tran.commit();
session.close();
}

/**
* 条件查询
*/
@Test
public void fun3() {
Session session = HibernateUtils.getOpenSession();
Transaction tran = session.beginTransaction();
String sql = "select * from stuinfo where id = ?";
// 创建查询对象
SQLQuery query = session.createSQLQuery(sql);
//传参 参一:下标  参二:值
query.setParameter(0, 1);
// 将结果集封装到对象中
query.addEntity(Stuinfo.class);
List<Stuinfo> list = query.list();
System.out.println(list.toString());
tran.commit();
session.close();
}

/**
* 分页查询
*/
@Test
public void fun4() {
Session session = HibernateUtils.getOpenSession();
Transaction tran = session.beginTransaction();
String sql = "select * from stuinfo limit ? , ?";
// 创建查询对象
SQLQuery query = session.createSQLQuery(sql);
//传参 参一:下标  参二:值

953d
query.setParameter(0, 0);
query.setParameter(1, 1);
// 将结果集封装到对象中
query.addEntity(Stuinfo.class);
List<Stuinfo> list = query.list();
System.out.println(list.toString());
tran.commit();
session.close();
}
}


Demo源码下载地址(免费):

http://download.csdn.net/detail/li521wang/9828741


希望这篇博客可以帮助大家更加深入的理解Hibernate中的查询并进行灵活的运行。这一知识点的掌握可以大大加快我们的开发效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: