Hibernate的六种查询方式

对于Hibernate的查询,会用到的有六种方式:HQL查询,SQL查询,QBC(对象化查询Criteria方法)查询,QBE(Query By Example 例子查询)查询,离线查询(使用DetachedCriteria)和命名查询

【1】HQL查询:

HQL语句是Hibernate自己的一套查询语言,与sql语句不同,具有跨数据的有点

static void query(String name){
	Session session = null ;
	try{
		session = HibernateUrl.getSession();
		String hql = " from User as user where user.name=:name order by user.name asc";
		Query query = sesion.createQuery(hql);
		query.setString("name",name);
		query.setFirstResult(0);
		query.setMaxResults(10);
		List<User> list = query.list();
		for(User user:list){
			System.out.println(user.getName());
		{
	}finally{
		if(session!=null){
			session.close();
		}
	}
}

注:from后面的是实体类的类名而不是表名

【2】SQL查询

Hibernate也可以执行sql语句,但是使用sql语句不面向对象,不方便维护

static void query(){
	Session session = null ;
	try{
		session = HibernateUrl.getSession();
		String sql = "select * from user";
		Query query = s.createSQLQuery(sql).addEntity(User.class);
		List<User> list = query.list();
		for(User user:list){
			System.out.println(user.getName());
		}
		session.commit();
	}finally{
		if(session!=null){
			session.close();
		}
	}
}

【3】QBC查询:

QBC(Query By Criteria),这种方式比较面向对象,有三个描述对象的对象:Restrictions、Order、Projections。使用QBC有三个步骤:

1、使用session的实例的createCriteria()方法创建Criteria对象;

2、使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类设置排序方式,Projections类提供聚合方法;

3、使用Criteria对象的list()方法进行查询并返回结果。

Restrictions类:

方法名称
描述
Restrictions.eq 等于
Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
Restrictions.gt 大于
Restrictions.ge 大于等于
Restrictions.lt 小于
Restrictions.le 小于等于
Restrictions.between 对应SQL的between
Restrictions.like 对应SQL的like
Restrictions.in 对应SQL的in
Restrictions.and and关系
Restrictions.or or关系
Restrictions.sqlRestriction SQL限定查询
Order类:

方法名称
描述
Order.asc 升序
Order.desc 降序
Projections类:

方法名称
描述
Projections.avg 求平均值
Projections.count 统计某属性的数量
Projections.countDistinct 统计某属性不同值的数量
Projections.groupProperty 指定某个属性为分组属性
Projections.max 求最大值
Projections.min 求最小值
Projections.projectionList 创建一个ProjectionList对象
Projections.rowCount 查询结果集中的记录条数
Projections.sum 求某属性的合计

static void query(String name,int age){
	Session session = null ;
	try{
		session = HibernateUrl.getSession();
		Criteria c = session.createCriteria(User.class);
		c.add(Restrictions.eq("name",name));
		c.add(Restrictions.lt("age",age));
		c.addOrder(Order.asc("name"));
		c.setProjection(Projections.avg("age"));
		c.setFirstResult(0);
		c.setMaxResults(10);
		List<User> list = c.list();
		for(User user:list){
			System.out.println(user.getName);
		}
	}finally{
		if(sessionion!=null){
			session.close();
		}
	}	
}
【4】QBE(Query By Example)

QBE:将一个对象的非空属性当做查询条件进行查询

static void query(){
	Session session = null ;
	try{
		session = HibernateUrl.getSession();
		User user = new User();
		user.setName("tom");
		user.setAge(24);
		Example example = Example.create(user);
		//example.enableLike(MatchMode.ANYWHERE);-->匹配模式,使用模糊查询必填
		//example.excludeNone();-->空的不做查询条件
		//example.excludeZeroes();-->0不要做查询
		//example.ignoreCase();
		//example.excludeProperty("age");-->忽略age字段
		List<User> list = session.createCriteria(User.class).add(example).list();
		session.commit();
	}finally{
		if(session!=null){
			session.close();
		}
	}
}

【5】使用动态分离查询即离线查询(DetachedCriteria)

离线查询是建立一个DetachedCriteria对象,将查询的条件指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。

//创建DetachedCriteria对象
staric void query(int id,String name){
	DetachedCriteria dc = DetachedCriteria.forClass(User.class);
	int id = id;
	String name = name ;
	if(id!= 0){
		dc.add(Restrictions.eq("id",id));
	}
	if(name!= null){
		dc.add(Restrictions.le("name",name));
	}
	list<User> list = dc(dc);
	for(User user:list){
		System.out.println(user.getId()+":"+user.getName());
	}
}
//执行方法
static void dc(DetachedCriteria dc){
	Session s = null ;
	try{
		session = HibernateUrl.getSession();
		Criteria c = dc.getExecutableCriteria(s);
		List<User> list = c.list();
		return list ;
	}finally{
		if(session!=null){
			session.close();
		}
	}
}
【6】命名查询

命名查询分为两步:

1、配置Hibernate映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.sy.vo.User" table="user" catalog="news" </class>
    <!-- 命名查询:定义hql -->
    <query name="getUserById">
     <![CDATA[from User where id=:id]]>
    </query>
    <!-- 命名查询中使用sql -->
    <sql-query name="getUserById2">
     <![CDATA[select * from User where ]]>
    </sql-query> 
</hibernate-mapping>
2、编写执行代码

static void query(int id){
	Session session = null ;
	try{
		session = HibernateUrl.getSession();
		Query query = session.getNamedQuery("getUserById");
		query.setInteger("id",id);
		List<User> list = query.list();
		for(User user:list){
			System.out.println(user.getName());
		}
	}finally{
		if(session!= null){
			session.close();
		}
	}
}






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值