hibernate学习之四——Query和Criteria接口

Query 和 Criteria 接口是 Hibernate 的查询接口,用于向数据库查询对象以及控制执行查询的过程。
Query 实例包装了一个 HQL(Hibernate Query Language)查询语句,HQL 查询语句与 SQL 查询语句有些相似,但 HQL 查询语句是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名。

Critieria 接口完全封装了基于字符串形式的查询语句,比 Query 接口更加面向对象,Criteria 接口擅长于执行动态查询

package com.test;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import com.bean.User;
import com.util.HibernateUtil;

public class QueryAndCniteria {
	private static SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
	
	//1.1,简单绑定参数查询,不使用表名而使用类名,bean
	//按参数位置绑定: 在 HQL 查询语句中用“?”来定义参数位置
	@Test
	public void query1(){
		//1,获取session对象
		Session session = sessionFactory.openSession();
		//2,hql
		Query query = session.createQuery("from User where name=? and age=? ");
		//3,为?赋值
		query.setString(0,"dada");
		query.setInteger(1,11);
		
		List list = query.list();
		for(User user:list){
			System.out.println(user.toString());
		}
		session.close();
	}
	//1.2,简单绑定参数查询,不使用表名而使用类名,bean
	//按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以“:”开头
	@Test
	public void query2(){
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from User where name=:name and age=:age");
		//第一个参数代表名字,第二个代表值
		query.setString("name", "dada");
		query.setInteger("age", 20);
		List list = query.list();
		for(User user : list){
			System.out.println(user.toString());
		}
		session.close();
	}
	
	//2,投影查询
	@Test
	public void query3(){
		Session session = sessionFactory.openSession();
		//注意这里投影查询哪些属性,那么bean类要有对应的构造方法
	/*	public User(String uid, String name) {
			super();
			this.uid = uid;
			this.name = name;
		}*/
		Query query = session.createQuery("select new com.bean.User(uid,name) from User");
		List list = query.list();
		for(User user : list){
			System.out.println(user.toString());
		}
		session.close();
	}
	
	//3,分页查询
	@Test
	public void query4(){
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from User");
		//设置分页查询的起始页面
		query.setFirstResult(0);
		//设置分页查询的显示页数
		query.setMaxResults(3);
		
		List list = query.list();
		for(User user : list){
			System.out.println(user.toString());
		}
		session.close();
		
	}
	
	//4,QBC(Query By Criteria)
	/*	
 	QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这
	种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口。
	QBC 提供的查询方式由:Criteria 接口,Criterion 接口和 Expression 类组成,支
	持在运行时动态生成查询语句
	*/
	//4.1,Criteria简单查询
	@Test
	public void query5(){
		//1,获取session对象
		Session session = sessionFactory.openSession();
		//2,通过session对象创建Criteria对象
		Criteria crit = session.createCriteria(User.class);
		//3,添加查询条件
		crit.add(Restrictions.eq("name","xiaohong"));
		crit.add(Restrictions.eq("age",0));
		
		List list = crit.list();
		for(User user:list){
			System.out.println(user.toString());
		}
	}
	
	//4.2,Criteria - 存面向对象的数据库查询方式
	//模糊查询
	@Test
	public void query6(){
		Session session = sessionFactory.openSession();
		Criteria crit = session.createCriteria(User.class);
		//添加条件
		crit.add(Restrictions.like("name", "%da%"));
		List list = crit.list();
		for(User user : list){
			System.out.println(user.toString());
		}
		session.close();
	}
}

相关方法说明
短语  含义
Restrictions.eq  等于=
Restrictions.allEq  方法的参数为一个 Map 类型对象,包含多个名/值
对对应关系, 相当于多个 Expression.eq 的叠加
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 限定查询

你可能感兴趣的:(Hibernate)