Hibernate HQL和QBC

OID查询

一、什么是OID查询

根据对象的OID主键进行检索

二、OID查询方式

1. get方法
  • 当get()方法被调用的时候就会立即发出SQL语句
  • 并且返回的对象也是实际的对象
  • 使用get()和普通的单条查询并没有多大的区别
  • 当查询不到的时候get()返回的是null
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user = currentSession.get(User.class, 1L);
System.out.println(user);
transaction.commit();
2. load方法
  • 当调用load()方法的时候会返回一个目标对象的代理对象
  • 在这个代理对象中只存储了目标对象的ID值
  • 只有当调用除ID值以外的属性值的时候才会发出SQL查询的
  • 当使用到除ID以外的属性的时候,会发出SQL查询语句
  • 当查询不到的时候load()报错 ObjectNotFoundException
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user = currentSession.load(User.class, 1L);
System.out.println(user.getUser_id());
System.out.println(user.getUser_name());
transaction.commit();

对象导航查询

Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。先查询到联系人,就可以通过联系人获取联系人所关联的客户对象。

HQL

一、什么是HQL

HQL查询:Hibernate Query Language,Hibernate的查询语言

    • 是一种面向对象的方式的查询语言,语法类似SQL。
  • 通过session.createQuery(),用于接收一个HQL进行查询方式。

二、查询

1. 简单查询

  • 注意:HQL当中不支持 * 的写法。所以 select * from 类名 是错误的。
  • createQuery("from 类名");
@Test
public void test(){
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("from User");
	List<User> list = query.list();
	for (User user : list) {
		System.out.println(user);
	} 
}

2. 别名查询

  • 注意:HQL当中不支持 * 的写法。所以 select * from 类名 是错误的。
  • createQuery("from 类名 别名");
@Test
public void test2(){
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("select c from User c");
	List<User> list = query.list();
	for (User user : list) {
		System.out.println(user);
	}
}

3. 排序查询

  • order by 字段 desc/asc
@Test
public void test3(){
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("select c from User c order by user_id desc");
	List<User> list = query.list();
	for (User user : list) {
		System.out.println(user);
	}
}

4. 条件查询

(1)位置绑定

根据参数的位置进行绑定条件(不常用)

@Test
public void test4() {
	Session session = HibernateUtil.openSession();
	// Query query = session.createQuery("from User where user_code=? and user_name=?");
	Query query = session.createQuery("from User where user_code=?0 and user_name=?1");
	query.setParameter(0, "user1");
	query.setParameter(1, "IT666");
	List<User> list = query.list();
	for (User user : list) {
		System.out.println(user);
	}
}
(2)名称绑定

把参数对应的值起一个名称 再去设置名称

@Test
public void test5() {
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("from User where user_code=:a and user_name=:b");
	query.setParameter("a", "user1");
	query.setParameter("b", "IT666");
	List<User> list = query.list();
	for (User user : list) {
		System.out.println(user);
	}
}

5. 投影查询

  • 查询对象的某个或某些属性
(1)单个属性
@Test
public void test5() {
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("select c.user_name from User c");
	List<Object> list = query.list();
	for (Object o : list) {
		System.out.println(o);
	}
}
(2)多个属性
@Test
public void test6() {
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("select c.user_code,c.user_name from User c");
	List<Object[]> list = query.list();
	for (Object[] o : list) {
		System.out.println(Arrays.toString(o));
	}
}
(3)查询多个属性,封装到对象当中,要在类中,提供构造方法
// 提供有参构造器时,尽量也写上无参构造器
public User() {}
	
public User(String user_code, String user_name) {
	this.user_code = user_code;
	this.user_name = user_name;
}
@Test
public void test7() {
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("select new User(user_code,user_name) from User c");
	List<User> list = query.list();
	for (User user : list) {
		System.out.println(user);
	}
}

6. 分页查询

@Test
public void test8() {
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("from User");
	query.setFirstResult(0);	// 角标开始位置
	query.setMaxResults(2);		// 一次查的条数
	List<User> list = query.list();
	for (User user : list) {
		System.out.println(user);
	}
}

7. 统计查询

(1)查询的结构只有一个
@Test
public void test9() {
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("select count(*) from User");
	Object result = query.uniqueResult();
	System.out.println(result);
}
(2)分组查询
@Test
public void test10() {
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("select user_code,count(*) from User group by user_code");
	List<Object[]> list = query.list();
	for (Object[] o : list) {
		System.out.println(Arrays.toString(o));
	}
}

8. 多表查询

(1)普通内连接
@Test
public void test11() {
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("from User u inner join u.roles");
	List<Object[]> list = query.list();
	for (Object[] o : list) {
		System.out.println(Arrays.toString(o));
	}
}
(2)迫切内连接

在普通内连接inner join 后添加一个关键字fetch,通过hibernate将另一个对象的数据,封装该对象中

@Test
public void test12() {
	Session session = HibernateUtil.openSession();
	Query query = session.createQuery("from User u inner join fetch u.roles");
	List<User> list = query.list();
	for (User user : list) {
		System.out.println(user);
	}
}

QBC

一、什么是QBC

Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。

二、查询

1. 简单查询

@Test
public void test() {
	Session session = HibernateUtil.openSession();
	Criteria criteria = session.createCriteria(User.class);
	List<User> list = criteria.list();
	for (User user : list) {
		System.out.println(user);
	}
}

2.排序查询

@Test
public void test2() {
	Session session = HibernateUtil.openSession();
	Criteria criteria = session.createCriteria(User.class);
	// 添加排序
	criteria.addOrder(Order.desc("user_id"));
	List<User> list = criteria.list();
	for (User user : list) {
		System.out.println(user);
	}
}

3.分页查询

@Test
	public void test3() {
		Session session = HibernateUtil.openSession();
		Criteria criteria = session.createCriteria(User.class);
		// 添加排序
		criteria.addOrder(Order.desc("user_id"));
		// 分页
		criteria.setFirstResult(0);
		criteria.setMaxResults(2);
		List<User> list = criteria.list();
		for (User user : list) {
			System.out.println(user);
		}
	}

4.条件查询

条件
= 	  eq
>    gt
>=   ge
<    lt
<=   le
<>   ne
like
in
and
or
单个条件
@Test
public void test4() {
	Session session = HibernateUtil.openSession();
	Criteria criteria = session.createCriteria(User.class);
	// 添加条件
	criteria.add(Restrictions.eq("user_code", "user2"));
	List<User> list = criteria.list();
	for (User user : list) {
		System.out.println(user);
	}
}
多个条件
@Test
public void test5() {
	Session session = HibernateUtil.openSession();
	Criteria criteria = session.createCriteria(User.class);
	// 多条件
	criteria.add(Restrictions.eq("user_code", "user2"));
	criteria.add(Restrictions.like("user_name", "%888"));
	List<User> list = criteria.list();
	for (User user : list) {
		System.out.println(user);
	}
}
统计查询

@Test
public void test6() {
	Session session = HibernateUtil.openSession();
	Criteria criteria = session.createCriteria(User.class);
	// 统计查询 只有一个结果
	criteria.setProjection(Projections.rowCount());
	Object result = criteria.uniqueResult();
	System.out.println(result);
}
离线条件查询
  • 脱离Session,添加条件
  • 可以在外部提前使用DetachedCriteria对象提交设置好条件
  • 最后再绑定到session当中
@Test
public void test7() {
	DetachedCriteria Criteria = DetachedCriteria.forClass(User.class);
	Criteria.add(Restrictions.like("user_name", "%888"));

	Session session = HibernateUtil.openSession();
	Criteria executableCriteria = Criteria.getExecutableCriteria(session);
	List<User> list = executableCriteria.list();

	for (User user : list) {
		System.out.println(user);
	}
}
posted @ 2019-05-05 14:49  Lomen~  阅读(962)  评论(0编辑  收藏  举报