同福

JPA Hibernate自定义查询和HQL的分页功能【20211102】

介绍

介绍

福哥在使用Sort、Pageable、Page对象进行数据列表查询的时候,发现这个查询功能不能设置查询条件,这个有比较悲惨了,毕竟大多数情况都不会是简单的整表遍历阿!

经过一番研究,发现可以通过JPA的自定义查询HQL来实现,HQL不同于SQL,SQL是数据库引起来解析执行的,而HQL是Hibernate来解析执行的。所以,大家要注意一点,SQL里面的数据表就是数据库的物理数据表,而HQL里面的数据表则是实体对象表。

教程

根据名称查询用户

这是一个通过userName来查询用户的例子。

定义

方法名称可以随便写。

方法参数根据HQL的需要设定。

HQL参数可以通过?1、?2...?N映射方法参数。

@Query(value = "select u from JpaUser as u where u.userName = ?1")
List getUserByName(String userName);

调用

List<JpaUser> results = repository.getUserByName("福哥");

home/topic/2021/1103/10/ccce10d6a793b3c4380940f887eef8ab.png

根据用户ID查询

这是一个通过userId来查询用户列表的例子。

定义

方法参数根据HQL的需要设定,通过@Param注解定义形参。

HQL参数可以通过形参映射方法参数。

@Query(value = "select u from JpaUser as u where u.userId in :userIds")
List getUsersByIds(@Param("userIds") Long[] userIds);

调用

List<JpaUser> results = repository.getUsersByIds(new Long[]{Long.valueOf(6), Long.valueOf(7), Long.valueOf(8)});

home/topic/2021/1103/11/7a505f1abe2651a4e75bb558839fd8e5.png

带分页的根据用户状态查询

这是一个根据用户状态查询的例子,本例展示了如何通过HQL查询数据并进行分页的方法。

定义

方法最后一个参数设置一个Pageable类型参数,作为查询结果的分页参数。

@Query(value = "select u from JpaUser as u where u.userState = :state")
Page getUsersByState(@Param("state") Integer state, Pageable pageable);

调用

Sort sort = Sort.by(Sort.Direction.DESC, "userId");
Pageable pageable = PageRequest.of(0, 10, sort);
Page<JpaUser> data = repository.getUsersByState(1, pageable);
List<JpaUser> results = new LinkedList<>();
for(JpaUser user : data){
    results.add(user);
}

home/topic/2021/1103/11/049e6313fac86f1a85e08f8d4a6012fe.png

总结

今天福哥带着童鞋们学习了JPA的自定义查询HQL的使用技巧,可以看到HQL才是我们平常做项目时候使用的技巧,它支持的功能更加强大,支持的功能更加丰富。