《Hibernate上课笔记》-----class8----Hibernate的检索方式和检索策略

简介: 《Hibernate上课笔记》-----class8----Hibernate的检索方式和检索策略

一: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中的参数:

20210330094607299.png

20210330094714114.png

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();
  }
}

类级别和关联级别可选的检索策略:


20210330100555518.png


配置方式:在class中添加lazy属性,true表示延迟检索


lazy="true"


关联级别检索策略一对多和多对多:


20210330100912645.png


关联级别检索策略多对一:


20210330100956958.png




相关文章
|
3天前
|
缓存 Java 数据库连接
构建高效数据库交互:Hibernate与JPA的性能优化策略
【6月更文挑战第25天】在大数据时代,优化Hibernate和JPA的数据库性能至关重要。本文探讨了优化策略:正确配置映射以减少冗余,利用JPQL/HQL提升查询效率,避免全字段选择,使用索引和分页,有效利用缓存策略,以及管理事务以平衡资源锁定。示例代码展示了分页查询的实现,以防止性能下降。
|
1月前
|
Java 数据库连接 数据库
Hibernate5中实体映射命名策略
Hibernate5中实体映射命名策略
66 0
|
1月前
|
SQL Java 数据库连接
Hibernate - QBC和本地SQL对象检索详解
Hibernate - QBC和本地SQL对象检索详解
41 0
|
1月前
|
SQL Java 数据库连接
Hibernate - HQL对象检索详解
Hibernate - HQL对象检索详解
34 0
|
1月前
|
SQL 缓存 Java
Hibernate - 检索策略入门与详解
Hibernate - 检索策略入门与详解
36 0
|
Java 关系型数据库 数据库连接
《Hibernate上课笔记》---class1---Hibernate简介
《Hibernate上课笔记》---class1---Hibernate简介
59 0
《Hibernate上课笔记》---class1---Hibernate简介
|
XML Java 数据库连接
《Hibernate上课笔记》----class4----Hibernate继承关系映射实现详解
《Hibernate上课笔记》----class4----Hibernate继承关系映射实现详解
76 0
《Hibernate上课笔记》----class4----Hibernate继承关系映射实现详解
|
XML Java 数据库连接
《Hibernate上课笔记》-----class5----Hibernate实现一对一关联映射
《Hibernate上课笔记》-----class5----Hibernate实现一对一关联映射
54 0
《Hibernate上课笔记》-----class5----Hibernate实现一对一关联映射
|
XML Java 数据库连接
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
49 0
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
|
XML Java 数据库连接
《Hibernate上课笔记》-----class7----Hibernate实现多对多关联映射
《Hibernate上课笔记》-----class7----Hibernate实现多对多关联映射
74 0
《Hibernate上课笔记》-----class7----Hibernate实现多对多关联映射