当我们使用方法名称很难,达到预期的查询结果,就可以使用@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. }

Spring-Data-JPA @Query注解 Sort排序的更多相关文章

  1. 【Spring Data 系列学习】Spring Data JPA @Query 注解查询

    [Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...

  2. Spring Data Jpa (四)注解式查询方法

    详细讲解声明式的查询方法 1 @Query详解 使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效.一般只需要关心@Query里面的value和nativeQuery的值.使用声明式JPQ ...

  3. spring data jpa @query的用法

    @Query注解的用法(Spring Data JPA) 参考文章:http://www.tuicool.com/articles/jQJBNv . 一个使用@Query注解的简单例子 @Query( ...

  4. Spring Data JPA @Column 注解无效 打出的语句有下划线

    最近再写一个Restful API的小例子,遇到这样一个问题,在Spring Boot 下使用CrudRepository,总是提示如下错误: Caused by: java.sql.SQLSynta ...

  5. Spring Data JPA 常用注解 @Query、@NamedQuery

    1.@Transient @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性:如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架 ...

  6. 使用Spring Data JPA进行数据分页与排序

    一.导读 如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好.所以处理较大数据查询结果展现的时候,分页查询是必不可少的.分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控 ...

  7. 整合Spring Data JPA与Spring MVC: 分页和排序

    之前我们学习了如何使用Jpa访问关系型数据库.比较完整Spring MVC和JPA教程请见Spring Data JPA实战入门,Spring MVC实战入门. 通过Jpa大大简化了我们对数据库的开发 ...

  8. 整合Spring Data JPA与Spring MVC: 分页和排序pageable

    https://www.tianmaying.com/tutorial/spring-jpa-page-sort Spring Data Jpa对于分页以及排序的查询也有着完美的支持,接下来,我们来学 ...

  9. Spring data Jpa,Mybatis,读写锁,@Lock 使用

    Spring data jpa 支持注解式的读写锁(悲观锁),实际上这个东西硬编码也简单,但是基于Jpa 命名方式定义的Sql,只能用注解添加支持读写锁了, 不了解读写锁的可以点这里 mysql读写锁 ...

随机推荐

  1. perl open函数的使用

    本文和大家重点讨论一下如何读写Perl文件,主要包括打开.关闭Perl文件,读写Perl文件,Perl文件的状态,命令行参数和打开管道六部分内容,希望通过本文的学习你对读写Perl文件有深刻的认识. ...

  2. python:数据类型dict

    一.字典 key -->value 储存大量数据,而且是关系型数据,查询速度非常快 数据类型分类: 可变数据类型:list , dict, set 不可变的数据类型:int , bool, st ...

  3. delphi combobox屏蔽鼠标滑动

    //第1种方法 procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; Mo ...

  4. linux服务nfs与dhcp篇

    nfs复习: 1.简介:用于liunx与linux之间的文件传输系统 2.下载nfs-utils和rpcbind 3.打开配置文件/etc/exports——文件名(目录名)共享给予的ip地址(rw) ...

  5. JS高级-异步

    单线程 只有一个线程,同一时间只能做一件事 原因:避免DOM渲染的冲突 浏览器需要渲染DOM JS可以修改DOM结果 JS执行的时候,浏览器DOM渲染会暂停 两段JS也不能同时执行(修改DOM就冲突) ...

  6. k8s学习笔记之一:kubernetes简介

    一.虚拟化技术 1.什么是虚拟化技术 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立 ...

  7. 在centos上面编译安装python

    前言 因为在学习storm的过程中需要安装python,storm是部署在linux上面的,所以需要将python安装在linux上面. 安装准备 python下载 官网链接:https://www. ...

  8. css:元素水平垂直居中的多种方式

    CSS元素(文本.图片)水平垂直居中方法   1.text-align:center; 2.margin:0 auto; 3.display:inline-block; + text-align:ce ...

  9. 浅谈MyBatisGenerator的使用

    目录 1.概述 2.依赖 3.Maven插件配置 4.配置文件说明 5.运行 6.总结 1.概述 日常中使用MyBatis最为麻烦的就是编写Mapper文件了, 如果数据库增加一张表, 这时通常会复制 ...

  10. MySQL的安装流程与入门

    MySQl是一种关系型数据库,存放的是文字数据,它是以“表”的形式进行存储的.由于MySQl的实用性和不收费,它在世界上是应用最多的数据库,但是,它不支持大量数据写入.接下来,我将为大家分享一下我学习 ...