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


相关文章
|
3月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
244 2
|
2天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
9天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
53 14
|
1月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
49 1
SpringBoot入门(7)- 配置热部署devtools工具
|
1月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
47 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
26天前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
47 5
|
1月前
|
Java 容器
springboot自动配置原理
启动类@SpringbootApplication注解下,有三个关键注解 (1)@springbootConfiguration:表示启动类是一个自动配置类 (2)@CompontScan:扫描启动类所在包外的组件到容器中 (3)@EnableConfigutarion:最关键的一个注解,他拥有两个子注解,其中@AutoConfigurationpackageu会将启动类所在包下的所有组件到容器中,@Import会导入一个自动配置文件选择器,他会去加载META_INF目录下的spring.factories文件,这个文件中存放很大自动配置类的全类名,这些类会根据元注解的装配条件生效,生效
|
1月前
|
安全 Java 测试技术
如何在 Spring Boot 中禁用 Actuator 端点安全?
如何在 Spring Boot 中禁用 Actuator 端点安全?
85 1
|
1月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
44 2