Spring Boot 中的 HQL 是什么,如何使用

Spring Boot 中的 HQL 是什么,如何使用

引言

在开发 Web 应用程序时,我们经常需要从数据库中查询数据。Spring Boot 中提供了多种方式来查询数据,其中之一就是使用 HQL(Hibernate Query Language)。HQL 是一种面向对象的查询语言,类似于 SQL,但是更加灵活和强大。本文将介绍 HQL 的基本用法,并附上代码示例,帮助读者更好地理解和使用该语言。

在这里插入图片描述

HQL 是什么?

HQL(Hibernate Query Language)是 Hibernate 框架中的一种查询语言,用来查询对象,类似于 SQL。与 SQL 不同的是,HQL 是基于对象的查询语言,可以直接操作对象,而不是表。HQL 支持各种查询操作,比如查询单个对象、查询多个对象、分页查询、排序等等。使用 HQL 可以使查询操作更加灵活和强大。

如何使用 HQL?

使用 HQL 前需要先配置 Hibernate,具体配置方式可以参考 Spring Boot 官方文档。接下来,我们可以在 DAO 层中使用 HQL 来查询数据。下面是一个简单的示例:

@Repository
public class UserDao {
    
    

    @Autowired
    private EntityManager entityManager;

    public User findById(Long id) {
    
    
        String hql = "from User where id = :id";
        TypedQuery<User> query = entityManager.createQuery(hql, User.class);
        query.setParameter("id", id);
        return query.getSingleResult();
    }

    public List<User> findAll() {
    
    
        String hql = "from User";
        TypedQuery<User> query = entityManager.createQuery(hql, User.class);
        return query.getResultList();
    }

}

上述示例中,我们定义了一个名为 UserDao 的 DAO 类,其中的 findById 和 findAll 方法分别用来查询单个用户和查询所有用户。在这两个方法中,我们使用了 HQL 来查询数据。需要注意的是,我们使用了 EntityManager 对象来执行 HQL,而不是使用 JdbcTemplate 或其他方式。

下面是一个更加复杂的示例,演示了如何使用 HQL 进行分页查询和排序:

@Repository
public class UserDao {
    
    

    @Autowired
    private EntityManager entityManager;

    public Page<User> findPage(int pageNo, int pageSize, String sortField, boolean ascending) {
    
    
        String hql = "select u from User u order by u." + sortField + (ascending ? " asc" : " desc");
        TypedQuery<User> query = entityManager.createQuery(hql, User.class);
        query.setFirstResult((pageNo - 1) * pageSize);
        query.setMaxResults(pageSize);

        List<User> resultList = query.getResultList();
        long totalCount = count();
        return new PageImpl<>(resultList, PageRequest.of(pageNo - 1, pageSize), totalCount);
    }

    public long count() {
    
    
        String hql = "select count(*) from User";
        TypedQuery<Long> query = entityManager.createQuery(hql, Long.class);
        return query.getSingleResult();
    }

}

上述示例中,我们定义了一个名为 UserDao 的 DAO 类,其中的 findPage 方法用来进行分页查询,count 方法用来查询记录总数。在 findPage 方法中,我们使用了 HQL 进行排序和分页查询。需要注意的是,我们使用了 Pageable 对象来表示分页信息,使用 PageImpl 对象来表示查询结果。

代码示例

下面是一个完整的示例,演示了如何使用 HQL 进行查询和分页:

实体类:

@Entity
public class User {
    
    

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private Integer age;

    // 省略 getter 和 setter 方法

}

DAO 类:

@Repository
public class UserDao {
    
    

    @Autowired
    private EntityManager entityManager;

    public User findById(Long id) {
    
    
        String hql = "from User where id = :id";
        TypedQuery<User> query = entityManager.createQuery(hql, User.class);
        query.setParameter("id", id);
        return query.getSingleResult();
    }

    public List<User> findAll() {
    
    
        String hql = "from User";
        TypedQuery<User> query = entityManager.createQuery(hql, User.class);
        return query.getResultList();
    }

   public Page<User> findPage(int pageNo, int pageSize, String sortField, boolean ascending) {
    
    
        String hql = "select u from User u order by u." + sortField + (ascending ? " asc" : " desc");
        TypedQuery<User> query = entityManager.createQuery(hql, User.class);
        query.setFirstResult((pageNo - 1) * pageSize);
        query.setMaxResults(pageSize);

        List<User> resultList = query.getResultList();
        long totalCount = count();
        return new PageImpl<>(resultList, PageRequest.of(pageNo - 1, pageSize), totalCount);
    }

    public long count() {
    
    
        String hql = "select count(*) from User";
        TypedQuery<Long> query = entityManager.createQuery(hql, Long.class);
        return query.getSingleResult();
    }

}

控制器类:

@RestController
@RequestMapping("/users")
public class UserController {
    
    

    @Autowired
    private UserDao userDao;

    @GetMapping("/{id}")
    public User findById(@PathVariable Long id) {
    
    
        return userDao.findById(id);
    }

    @GetMapping
    public List<User> findAll() {
    
    
        return userDao.findAll();
    }

    @GetMapping("/page")
    public Page<User> findPage(@RequestParam int pageNo, @RequestParam int pageSize, @RequestParam String sortField, @RequestParam boolean ascending) {
    
    
        return userDao.findPage(pageNo, pageSize, sortField, ascending);
    }

}

上述示例中,我们定义了一个 UserController 类,其中的 findById、findAll 和 findPage 方法分别用来查询单个用户、查询所有用户和进行分页查询。在 findPage 方法中,我们使用了 HQL 进行排序和分页查询。需要注意的是,我们使用了 Pageable 对象来表示分页信息,使用 PageImpl 对象来表示查询结果。

总结

本文介绍了 Spring Boot 中的 HQL,讲解了 HQL 的基本用法和示例代码。通过使用 HQL,我们可以更加灵活和强大地查询数据库中的数据。需要注意的是,在使用 HQL 时需要配置好 Hibernate,以及正确地使用 EntityManager 对象来执行 HQL。希望本文对读者有所帮助。

猜你喜欢

转载自blog.csdn.net/JasonXu94/article/details/131609547