介绍
介绍
福哥在使用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("福哥");
根据用户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)});
带分页的根据用户状态查询
这是一个根据用户状态查询的例子,本例展示了如何通过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); }
总结
今天福哥带着童鞋们学习了JPA的自定义查询HQL的使用技巧,可以看到HQL才是我们平常做项目时候使用的技巧,它支持的功能更加强大,支持的功能更加丰富。