Spring-Data-JPA @Query注解 Sort排序

当我们使用方法名称很难,达到预期的查询结果,就可以使用@Query进行查询,@Query是一种添加自定义查询的便利方式

方法名称查询见http://blog.csdn.net/niugang0920/article/details/79426521

使用@Query注解,使用注解有两种方式,一种是JPQL的SQL语言方式,一种是原生SQL的语言.

1.User.java 实体类

  1. package com.niugang.entity;
  2. import javax.persistence.Column;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8. //javax.persistence.Entity
  9. @Entity
  10. @Table(name="user")
  11. public class User {
  12. /**
  13. *mysql 自定生成主键
  14. *指示持久性提供者必须分配使用数据库标识列的实体的主键
  15. */
  16. @Id
  17. @GeneratedValue(strategy = GenerationType.IDENTITY)  
  18. @Column(name="id" ,insertable=false,updatable=false)
  19. private Integer id;
  20. /**
  21. * @Column中的name默认和字段名相同
  22. */
  23. @Column(name = "name")
  24. private String name;
  25. @Column(name = "age")
  26. private Integer age;
  27. @Column(name = "phone")
  28. private String phone;
  29. @Column(name = "password")
  30.  
  31. private String password;
  32.  
  33.         public String getPassword() {
  34. return password;
  35. }
  36. public void setPassword(String password) {
  37. this.password = password;
  38. }
  39. public Integer getId() {
  40. return id;
  41. }
  42. public void setId(Integer id) {
  43. this.id = id;
  44. }
  45. public String getName() {
  46. return name;
  47. }
  48. public void setName(String name) {
  49. this.name = name;
  50. }
  51. public Integer getAge() {
  52. return age;
  53. }
  54. public void setAge(Integer age) {
  55. this.age = age;
  56. }
  57. public String getPhone() {
  58. return phone;
  59. }
  60. public void setPhone(String phone) {
  61. this.phone = phone;
  62. }
  63. @Override
  64. public String toString() {
  65. return "User [id=" + id + ", name=" + name + ", age=" + age + ", phone=" + phone + ", password=" + password
  66. + "]";
  67. }
  68.  
  69. }

2.UserDao.java

  1. package com.niugang.dao;
  2. import java.util.List;
  3. import org.springframework.data.domain.Page;
  4. import org.springframework.data.domain.Pageable;
  5. import org.springframework.data.jpa.repository.JpaRepository;
  6. import org.springframework.data.jpa.repository.Query;
  7. import org.springframework.data.repository.query.Param;
  8. import org.springframework.stereotype.Repository;
  9. import com.niugang.entity.User;
  10. /**
  11.  * JpaRepository springboot已经自动配置了,也已经注入数据源了
  12.  * 
  13.  * @author niugang
  14.  *
  15.  */
  16. @Repository
  17. public interface UserDao extends JpaRepository<User, Integer> {
  18. /**
  19. * ?加数字表示占位符,?1代表在方法参数里的第一个参数,区别于其他的index,这里从1开始
  20. */
  21. // select * from User where name = ?1 注意不能写成*
  22. @Query(value = "select u from  User u where u.name = ?1")
  23. User findUserByName1(String name);
  24.  
  25.  
  26. /**
  27. * =:加上变量名,这里是与方法参数中有@Param的值匹配的,而不是与实际参数匹配的 和上面第一个原理是一样的
  28. */
  29. @Query(value = "select u from  User u where u.name = :name")
  30.  
  31. User findUserByName2(@Param("name") String username);
  32.  
  33.        /**
  34. * 通过原生sql 进行查询
  35. * 开启nativeQuery=true,在value里可以用原生SQL语句完成查询
  36. */
  37. @Query(nativeQuery = true, value = "select * from  user u where u.name = :name")
  38. User findUserByNativeSQL(@Param("name") String username);
  39.  
  40.  
  41. /**
  42. * 模糊查询 这里的%只能放在占位的前面,后面不行
  43. */
  44. @Query(value = "select u from  User u where u.name like  %?1% ")
  45. List<User> findUserLike(String name);
  46.  
  47.  
  48. /**
  49. * 调条件分页查询 Pageable:spring-data-jpa自带接口
  50. * @param name
  51. *            :查询条件name
  52. * @param page:分页对象
  53. * @return
  54. */
  55. @Query(value = "select u from  User u where u.name like  %?1% ")
  56.  
  57. Page<User> findUserLikeByPage(String name, Pageable page);
  58.  
  59.      /**
  60. * @Query查询不支持,排序并且分页
  61. * 源码分析
  62. * if (hasParameterOfType(method, Pageable.class)) {
  63.  
  64.  
  65. if (!isStreamQuery()) {
  66. assertReturnTypeAssignable(method, Slice.class, Page.class, List.class);
  67. }
  68.  
  69.  
  70. if (hasParameterOfType(method, Sort.class)) {
  71. throw new IllegalStateException(String.format("Method must not have Pageable *and* Sort parameter. "
  72. + "Use sorting capabilities on Pageble instead! Offending method: %s", method.toString()));
  73. }
  74. }
  75. * @param sort :排序对象 org.springframework.data.domain.Sort
  76. * @return
  77. */
  78. @Query(value = "select u from  User u")
  79. List<User> findUserLikeBySort(Sort sort);
  80.  
  81. }

3.   findUserLikeByPage(String name, Pageable page)接口解释:

  1.   public Page<User> findUserByPage(String name) {
  2.   PageRequest pageRequest = new PageRequest(0, 4);
  3.   return userDao.findUserLikeByPage(name, pageRequest);
  4.  
  5. }

4.排序测试代码

  1. /**
  2. * 单条件排序
  3. */
  4. public List<User> findListSortSingleCondition(){
  5. //id升序查询
  6. Sort sort = new Sort(Sort.Direction.ASC,"id");
  7. return userDao.findUserLikeBySort(sort);
  8. }
  9. /**
  10. * 多条件排序
  11. */
  12. public List<User> findListSortMultiCondition(){
  13. List<Order> orders= new ArrayList<Order>();
  14. Order orderId = new Sort.Order(Sort.Direction.DESC,"id");
  15. Order orderAge = new Sort.Order(Sort.Direction.DESC,"age");
  16. orders.add(orderId);
  17. orders.add(orderAge);
  18. Sort sort = new Sort(orders);
  19. return userDao.findUserLikeBySort(sort);
  20. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【2021年,将Spring全家桶系列课程进行Review,修复顺序等错误。进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并新增高级的Spring Security等内容,通过手把手一步步教你从零开始学会应用Spring,课件将逐步进行上传,敬请期待】 本课程是Spring案例精讲课程的第五部分Spring Data,Spring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Spring Data的核心知识点:Spring Data Repository、Spring Data JPA(增删改查案例、实体自动生成数据库表、增加新的Repository方法、分页、排序、@NamedQuery、@Query及其分页和排序及参数设置、@NamedEntityGragh实现多对多映射、及QueryHints等)、Spring Data JDBC(增删改查案例、@Query等)的案例介绍, 快速掌握Spring Data的核心知识,快速上手,为学习及工作做好充足的准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不会做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。 【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVC、Spring Boot、Spring Cloud及Spring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验  【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】5. 进阶篇:SpringData 
### 回答1: Spring Data JPA中的@Query注解可以在抽象方法上使用。该注解允许我们直接编写自定义的SQL查询语句,以替代默认的基于方法命名规则的查询。 使用@Query注解,我们可以在抽象方法上定义自己的查询语句。可以通过在注解中编写原生的SQL查询语句或者使用JPQL查询语句来完成。 当使用原生的SQL查询语句时,我们需要设置nativeQuery参数为true。这样Spring Data JPA就会将查询结果与实体类进行映射。 如果使用JPQL查询语句,我们可以通过在查询语句中引用实体类和其属性来构建查询语句。Spring Data JPA会根据查询语句的返回类型自动进行结果映射。 在@Query注解中,我们还可以使用命名参数或者索引参数来指定查询参数。通过在查询方法的参数前添加@Param注解,我们可以将方法参数与查询参数进行映射。 除了定义查询语句,@Query注解还可以指定查询的排序方式、分页和锁定等。我们可以使用关键字ORDER BY来设置排序字段,使用关键字LIMIT和OFFSET来设置分页查询的起始位置和返回记录数。同时,我们还可以使用关键字FOR UPDATE来设置查询结果的锁定。 通过在抽象方法上使用@Query注解,我们可以实现更加灵活和复杂的查询需求。它为我们提供了一种强大的方式来利用Spring Data JPA进行自定义查询,以满足特定业务场景的需求。 ### 回答2: Spring Data JPA提供了一个 @Query 注解,可以在抽象方法上使用。 @Query 注解用于在 Repository 接口中定义查询方法的具体查询语句。通过使用 @Query 注解,我们可以将自定义的 JPQL 或者 SQL 语句与方法绑定在一起。 使用 @Query 注解有以下几个优点: 1. 灵活性:可以使用自定义的查询语句,满足特定的数据查询需求。 2. 类型安全:由于使用了命名参数或者索引参数,可以避免 SQL 注入等安全问题。 3. 提高代码可读性:通过在方法上添加 @Query 注解,可以直接看到方法的具体查询是如何实现的,提高代码的可读性和可维护性。 4. 内置分页支持:可以在 @Query 注解中使用内置的分页查询方法,如 Pageable 和 Sort。 使用 @Query 注解时,可以将查询语句写在注解的 value 属性中。语句可以是原生的 SQL 语句,也可以是 JPQL 查询语句。在查询语句中,可以使用实体类的属性名来代替数据库表字段名。 另外,@Query 注解还支持使用命名参数和索引参数。命名参数使用冒号(:)加参数名的方式,在方法参数中使用 @Param 注解指定参数名。索引参数使用问号(?)加索引位置的方式。 需要注意的是,使用 @Query 注解时,方法的返回类型可以是具体的实体类,也可以是包装类、List、Set 或者其他集合类。如果需要分页查询,返回类型可以是 Page 或者 Slice 类型。 总的来说,通过在抽象方法中使用 Spring Data JPA 的 @Query 注解,可以更加灵活地定义自定义查询,提高代码的可读性和可维护性。 ### 回答3: Spring Data JPA提供了 @Query 注解,它可以用在抽象方法上,用于自定义查询语句。 使用 @Query 注解,我们可以在抽象方法上定义自己的JPQL(Java Persistence Query Language)或SQL查询语句。通过在注解中定义查询语句,我们可以灵活地执行各种复杂的查询操作。 在定义查询语句时,我们可以使用实体类的属性名来引用实体的字段,并且可以使用 JPA 提供的各种查询关键字和函数进行组合。除此之外,我们还可以使用一些特殊的 JPA 提供的关键字,如:distinct、is not null、is null、order by等。 在定义查询语句时,@Query 注解还支持使用命名参数和位置参数两种方式来传递参数。命名参数使用 :paramName 的方式来引用参数,而位置参数使用 ?1、?2 等符号来引用参数。我们可以根据实际情况选择适合的参数传递方式。 除了定义查询语句,@Query 注解还有其他一些属性。例如,我们可以使用 @Modifying 注解来告诉 Spring Data JPA 这个查询是一个更新操作,需要通过 @Transactional 注解来开启事务。另外,还可以使用 @Query 注解的 nativeQuery 属性来指示是否执行原生 SQL 查询。 总之,通过在抽象方法上使用 @Query 注解,我们可以自定义我们需要的查询语句,使得我们可以方便地执行各种复杂的查询操作。这样,在使用 Spring Data JPA 进行数据访问时,我们就能够更加灵活地控制查询操作,并且减少重复代码的编写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值