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

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

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


引言


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


image.png


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。希望本文对读者有所帮助。


相关文章
|
6天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
63 0
|
6天前
|
缓存 Java Maven
Spring Boot自动配置原理
Spring Boot自动配置原理
53 0
|
6天前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
143 0
|
6天前
|
存储 JSON Java
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
50 2
|
6天前
|
前端开发 搜索推荐 Java
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
|
6天前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置
|
6天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
6天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
33 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
6天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
38 0
【Spring系列】Sping VS Sping Boot区别与联系
|
6天前
|
缓存 前端开发 Java
SpringBoot启动后加载初始化数据
SpringBoot启动后加载初始化数据