一:Hibernate检索方式
1.HQL检索方式
使用面向对象的HQL查询语言进行查询
示例:
public class Test {
public static void main(String[] args) {
//findOrder();
//findOrder2();
//findOrder3();
//findUserByPage(2, 3);
findAllUsers();
HibernateUtil.closeFactory();
}
/**
* 查询订单数量大于0的所有用户
*/
public static void findOrder() {
Session session=HibernateUtil.openSession();
String hql="from User u where 0<(select count(o) from u.orders o)";
Query query=session.createQuery(hql);
List<User> users=query.list();
for(User user:users) {
System.out.println(user);
}
session.close();
}
/**
* 查询有订单的用户(使用in关键字)
*/
public static void findOrder2() {
Session session=HibernateUtil.openSession();
String hql="from User u where u in(select o.user from Order o group by o.user)";
Query query=session.createQuery(hql);
List<User> users=query.list();
for(User user:users) {
System.out.println(user);
}
session.close();
}
/**
* 查询有订单的用户(使用函数)
*/
public static void findOrder3() {
Session session=HibernateUtil.openSession();
String hql="from User u where size(u.orders)>0";
Query query=session.createQuery(hql);
List<User> users=query.list();
for(User user:users) {
System.out.println(user);
}
session.close();
}
/**
* hql进行分页查询
*/
public static void findUserByPage(int pageNum,int pageSize) {
Session session=HibernateUtil.openSession();
String hql="from User";
Query query=session.createQuery(hql);
query.setFirstResult((pageNum-1)*pageSize);//每页的第一个数据
query.setMaxResults(pageSize);//每页的数量
List<User> users=query.list();
System.out.println(users);
session.close();
}
/**
* hql的引用查询
*/
public static void findAllUsers() {
Session session=HibernateUtil.openSession();
Query query=session.createNamedQuery("findAllUsers", User.class);
List list=query.list();
System.out.println(list);
session.close();
}
}
2.QBC(Query By Criteria)查询
- QBC可以看做是传统SQL的对象化表示
- 主要由Criteria接口,Criterion接口,Restrictions类组成。
- 可以看做是对HQL的再一次封装
示例:
public class Test1 {
public static void main(String[] args) {
searchByQBC();
}
//使用QBC进行检索
public static void searchByQBC() {
Session session=HibernateUtil.openSession();
Criteria criteria=session.createCriteria(User.class);
Criterion c1=Restrictions.eq("userName","张三");
criteria.add(c1);
List<User> users=criteria.list();
System.out.println(users);
}
}
Restrictions中的参数:
3.本地SQL查询
根据数据库本身的查询,可以使用数据库自己的方言
测试:
public class Test3 {
public static void main(String[] args) {
searchUser();
}
public static void searchUser() {
Session session=HibernateUtil.openSession();
String sql="select * from user";
NativeQuery query=session.createNativeQuery(sql,User.class);
List<User> users=query.list();
for(User user:users) {
System.out.println(user);
}
session.close();
}
}
二:Hibernate的检索策略
立即检索: 立即加载检索方法指定的对象。
- 加载多余需要的对象白白浪费内存空间。
- select 语句数量多,频繁访问数据库,影响系统性能。
延迟检索: 延迟加载检索方法指定的对象。
- 避免多加载应用程序不需要访问的数据对象。
迫切左外连接检索: 利用SQL外连接查询功能加载检索方法指定对象。
- 减少执行select语句的数量,减少数据库访问,提高系统性能。
- 类级别的检索策略:Hibernate检索方法指定的检索对象(User)的检索策略;
- 关联级别的检索策略:与检索方法指定的检索对象相关的对象(Order)的检索策略。
应用:
public class Test2 {
public static void main(String[] args) {
//search();
search1();
}
/**
* Hibernate类级别的立即检索和延迟检索
*/
public static void search() {
Session session=HibernateUtil.openSession();
//User user=session.get(User.class, new Integer(1));//类级别的立即检索,会执行SQL语句
User user=session.load(User.class,new Integer(4));//类级别的延迟检索,当使用这个对象时才会执行sql语句,只是会创建Oid属性
Hibernate.initialize(user);//这个方法也会初始化对象
//System.out.println(user.getPassWord());
System.out.println(user);
session.close();
}
/*
* 默认情况下多对一和一对一的检索方式
*/
public static void search1() {
Session session=HibernateUtil.openSession();
Order order=session.get (Order.class,new Integer(1));
System.out.println(order);
session.close();
}
}
类级别和关联级别可选的检索策略:
配置方式:在class中添加lazy属性,true表示延迟检索
lazy="true"
关联级别检索策略一对多和多对多:
关联级别检索策略多对一: