【Hibernate】06 查询API

三种查询API

- Query

  不需要SQL语句,但是要HQL语句

- Criteria

  不需要任何QL语句,直接调用即可

- SQLQuery

  调用底层的SQL语句实现


什么是HQL?

Hibernate Query Language

- 和SQL语言相似

HQL & SQL 的区别?

- SQL 操作数据表和表的字段

- HQL操作实体类的实例和实例的属性


使用Query查询表的所有信息

- 使用Query入参必须要写HQL语句

- 建议写类名的时候使用完全限定名,和数据表也好区分开来

- List集合引用可以使用泛型

    @Test
    public void userQueryInstanceToSelectAll(){
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction transaction = null;

        try{
            sessionFactory = HibernateUtil.getSessionFactory();
            session = sessionFactory.openSession();
            transaction = session.beginTransaction();

            // 获取查询结果
            Query query = session.createQuery("from cn.dai.entity.User");

            // 结果实例调用list方法返回一个可以操作的List容器实例
            List<User> list = query.list();

            // 遍历查看
            for (User user:list) System.out.println(user);

            transaction.commit();
        } catch (Exception exception){
            transaction.rollback(); // 发生异常,回滚事务
            exception.printStackTrace(); // 打印异常信息
        } finally {
            if (session != null) session.close();
            if (sessionFactory != null )sessionFactory.close(); // 然后释放工厂对象
        }
    }

使用Criteria查询所有信息

    @Test
    public void userQueryInstanceToSelectAll(){
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction transaction = null;

        try{
            sessionFactory = HibernateUtil.getSessionFactory();
            session = sessionFactory.openSession();
            transaction = session.beginTransaction();

            // 调用创建,并且注入实体类的字节实例
            Criteria criteria = session.createCriteria(User.class);

            // 调用List即查询所有
            List<User> list = criteria.list();

            // 遍历查看
            for (User user:list) System.out.println(user);

            transaction.commit();
        } catch (Exception exception){
            transaction.rollback(); // 发生异常,回滚事务
            exception.printStackTrace(); // 打印异常信息
        } finally {
            if (session != null) session.close();
            if (sessionFactory != null )sessionFactory.close(); // 然后释放工厂对象
        }
    }

注意官方的注解标识为已过时,说明不推荐使用此实例去查询了

查看所有的重载方法,全部标记过时


使用SQLQuery实现查询所有

    @Test
    public void userQueryInstanceToSelectAll(){
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction transaction = null;

        try{
            sessionFactory = HibernateUtil.getSessionFactory();
            session = sessionFactory.openSession();
            transaction = session.beginTransaction();


            NativeQuery sqlQuery = session.createSQLQuery("SELECT * FROM user");

            // 容器的元素是 Object类型的数组
            List<Object[]> list = sqlQuery.list();

            for (Object[] objects:list){
                System.out.println(Arrays.toString(objects));
            }
            
            transaction.commit();
        } catch (Exception exception){
            transaction.rollback(); // 发生异常,回滚事务
            exception.printStackTrace(); // 打印异常信息
        } finally {
            if (session != null) session.close();
            if (sessionFactory != null )sessionFactory.close(); // 然后释放工厂对象
        }
    }

我们需要先添加这个实体类型,才能返回类型结果

            NativeQuery sqlQuery = session.createSQLQuery("SELECT * FROM user");

            sqlQuery.addEntity(User.class);

            // 容器的元素是 Object类型的数组
            List<User> list = sqlQuery.list();
            
            for (User user:list){
                System.out.println(user);
            }

原文地址:https://www.cnblogs.com/mindzone/p/12865736.html