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


相关文章
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
166 2
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
12天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
26 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
8天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
21 2
|
4月前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
54 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
4月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
119 0
|
1月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
177 2
|
1月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
139 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......