验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

Java Hibernate中的查询方式有哪些

阅读:1028 来源:乙速云 作者:代码code

Java Hibernate中的查询方式有哪些

      Hibernate 是一个开源的 ORM(对象关系映射)框架,它可以将 Java 对象映射到数据库表中,实现对象与关系数据库的映射。Hibernate 提供了多种查询方式,包括 OID 检索、对象导航检索、HQL 检索、QBC 检索和 SQL 检索。除此之外,Hibernate 还提供了多种抓取策略,包括立即抓取、延迟抓取和批量抓取。

      查询方式

      OID 检索

      OID(Object IDentifier)是 Hibernate 中每个持久化对象的唯一标识符。OID 检索是通过调用 get() 或 load() 方法来获得一个持久化对象的方式。这两个方法的区别在于当对象不存在时,get() 方法返回 null,而 load() 方法会抛出 ObjectNotFoundException 异常。

      示例代码:

      Session session = sessionFactory.openSession();
      Transaction tx = session.beginTransaction();
      User user = (User) session.get(User.class, 1L);
      tx.commit();
      session.close();

      对象导航检索

      对象导航检索是通过调用一个持久化对象的 getter 方法获得其他持久化对象的方式。例如,如果一个 User 对象有一个关联的 Order 对象,可以通过调用 user.getOrders() 方法来获得该 User 的所有订单。

      示例代码:

      Session session = sessionFactory.openSession();
      Transaction tx = session.beginTransaction();
      User user = (User) session.get(User.class, 1L);
      Set orders = user.getOrders();
      tx.commit();
      session.close();

      HQL 检索

      HQL(Hibernate Query Language)是一种面向对象的查询语言,类似于 SQL,但是它查询的是对象,而不是表。HQL 使用类名和属性名来表示表和字段,可以使用类似于 SQL 的语法进行查询。

      示例代码:

      Session session = sessionFactory.openSession();
      Transaction tx = session.beginTransaction();
      List users = session.createQuery("from User").list();
      tx.commit();
      session.close();

      QBC 检索

      QBC(Query By Criteria)检索是一种基于 Criteria API 的查询方式,可以使用一组条件来查询对象。Criteria API 提供了一种类型安全的查询方式,可以通过代码来构建查询条件,从而避免了字符串拼接的风险。

      示例代码:

      Session session = sessionFactory.openSession();
      Transaction tx = session.beginTransaction();
      Criteria criteria = session.createCriteria(User.class);
      List users = criteria.add(Restrictions.eq("name", "John")).list();
      tx.commit();
      session.close();

      SQL 检索

      SQL 检索是一种基于 SQL 语句的查询方式,可以使用原生的 SQL 语句来查询对象。使用 SQL 检索的一个常见场景是查询复杂的报表数据。

      示例代码:

      Session session = sessionFactory.openSession();
      Transaction tx = session.beginTransaction();
      SQLQuery query = session.createSQLQuery("select * from user");
      List users = query.list();
      tx.commit();
      session.close();

      抓取策略

      立即抓取

      立即抓取是指在加载一个持久化对象时,同时加载该对象关联的其他持久化对象。这种方式可以避免在后续访问关联对象时产生额外的 SQL 查询,提高了系统的性能。

      示例代码:

      Session session = sessionFactory.openSession();
      Transaction tx = session.beginTransaction();
      List users = session.createQuery("from User u left join fetch u.orders").list();
      tx.commit();
      session.close();

      延迟抓取

      延迟抓取是指当访问一个持久化对象的关联对象时,才去加载该关联对象。这种方式可以减少不必要的 SQL 查询,提高系统的性能。

      示例代码:

      Session session = sessionFactory.openSession();
      Transaction tx = session.beginTransaction();
      User user = (User) session.get(User.class, 1L);
      Hibernate.initialize(user.getOrders());
      tx.commit();
      session.close();

      抓取策略

      Hibernate 提供了多种抓取策略,包括 join、select、subselect 和 batch 策略。这些策略可以在查询时指定,从而控制 Hibernate 的抓取行为。

      示例代码:

      Session session = sessionFactory.openSession();
      Transaction tx = session.beginTransaction();
      Criteria criteria = session.createCriteria(User.class);
      criteria.setFetchMode("orders", FetchMode.JOIN);
      List users = criteria.list();
      tx.commit();
      session.close();

      批量抓取

      批量抓取是指在加载一批持久化对象时,同时加载这些对象关联的其他持久化对象。这种方式可以减少不必要的 SQL 查询,提高系统的性能。

      示例代码:

      Session session = sessionFactory.openSession();
      Transaction tx = session.beginTransaction();
      List users = session.createQuery("from User u left join fetch u.orders").setFirstResult(0).setMaxResults(10).list();
      tx.commit();
      session.close();
    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>