参考文章:http://www.tuicool.com/articles/jQJBNv

1. 一个使用@Query注解的简单例子

@Query(value = "select name,author,price from Book b where b.price>?1 and b.price<?2")
List<Book> findByPriceRange(long price1, long price2);

2.  Like表达式

@Query(value = "select name,author,price from Book b where b.name like %:name%")
List<Book> findByNameMatch(@Param("name") String name);

3. 使用Native SQL Query

所谓本地查询,就是使用原生的sql语句(根据数据库的不同,在sql的语法或结构方面可能有所区别)进行查询数据库的操作。

@Query(value = "select * from book b where b.name=?1", nativeQuery = true)
List<Book> findByName(String name);

4. 使用@Param注解注入参数

@Query(value = "select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price")
List<Book> findByNamedParam(@Param("name") String name, @Param("author") String author,@Param("price") long price);

5. SPEL表达式(使用时请参考最后的补充说明)

'#{#entityName}'值为'Book'对象对应的数据表名称(book)。

public interface BookQueryRepositoryExample extends Repository<Book, Long>{

@Query(value = "select * from #{#entityName} b where b.name=?1", nativeQuery = true)
       List<Book> findByName(String name);

}

6. 一个较完整的例子

public interface BookQueryRepositoryExample extends Repository<Book, Long> {@Query(value = "select * from Book b where b.name=?1", nativeQuery = true) List<Book> findByName(String name);// 此方法sql将会报错(java.lang.IllegalArgumentException),看出原因了吗,若没看出来,请看下一个例子@Query(value = "select name,author,price from Book b where b.price>?1 and b.price<?2")List<Book> findByPriceRange(long price1, long price2);@Query(value = "select name,author,price from Book b where b.name like %:name%")List<Book> findByNameMatch(@Param("name") String name);@Query(value = "select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price")List<Book> findByNamedParam(@Param("name") String name, @Param("author") String author,@Param("price") long price);}

7.  解释例6中错误的原因:

因为指定了nativeQuery = true,即使用原生的sql语句查询。使用java对象'Book'作为表名来查自然是不对的。只需将Book替换为表名book。

@Query(value = "select * from book b where b.name=?1", nativeQuery = true)
List<Book> findByName(String name);

补充说明(2017-01-12):

  有同学提出来了,例子5中用'#{#entityName}'为啥取不到值啊?

  先来说一说'#{#entityName}'到底是个啥。从字面来看,'#{#entityName}'不就是实体类的名称么,对,他就是。

  实体类Book,使用@Entity注解后,spring会将实体类Book纳入管理。默认'#{#entityName}'的值就是'Book'。

  但是如果使用了@Entity(name = "book")来注解实体类Book,此时'#{#entityName}'的值就变成了'book'。

  到此,事情就明了了,只需要在用@Entity来注解实体类时指定name为此实体类对应的表名。在原生sql语句中,就可以把'#{#entityName}'来作为数据表名使用。

  

@Query注解的用法(Spring Data JPA)相关推荐

  1. mysql jpa 批注 视图_通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句...

    参考: https://blog.csdn.net/qq465235530/article/details/68064074 https://www.cnblogs.com/zj0208/p/6008 ...

  2. Spring Data Jpa的@Temporal注解

     @Temporal注解存在于Spring Data Jpa依赖中 <dependency><groupId>org.springframework.boot</grou ...

  3. Spring Data JPA 从入门到精通~JpaSpecificationExecutor示例

    新建两个实体 @Entity(name = "UserInfoEntity") @Table(name = "user_info", schema = &quo ...

  4. SpringBoot22-spingboot数据访问-Spring Data JPA

    一:点睛Spring Data JPA 1,什么事Spring Data JPA 我们知道Hibernate是数据访问解决技术的绝对霸主,使用O/R映射技术实现数据访问,o/r映射即将领域模型类和数据 ...

  5. Springboot整合Spring Data JPA

    1 Spring Data JPA 1.Spring Data JPA的概念 在介绍Spring Data JPA的时候,我们首先认识下Hibernate.Hibernate是数据访问解决技术的绝对霸 ...

  6. Spring Data JPA 之 @Query 语法详解及其应用

    5 Spring Data JPA 之 @Query 语法详解及其应用 5.1 快速体验 @Query 的方法 沿⽤我们之前的例⼦,新增⼀个 @Query 的⽅法: // 通过 query 注解根据 ...

  7. Spring Data JPA 从入门到精通~@Param用法

    默认情况下,参数是通过顺序绑定在查询语句上的,这使得查询方法对参数位置的重构容易出错.为了解决这个问题,可以使用 @ Param 注解指定方法参数的具体名称,通过绑定的参数名字做查询条件,这样不需要关 ...

  8. Spring Data Jpa使用@Query时 报错Validation failed for query for method public abstract

    问题:在使用Spring Data Jpa作为持久化层,在使用@Query注解时出现以下错误: Validation failed for query for method public abstra ...

  9. Spring Data JPA REST Query QueryDSL

    案例概述 在本教程中,我们将研究使用Spring Data JPA和Querydsl为REST API构建查询语言. 在本系列的前两篇文章中,我们使用JPA Criteria和Spring Data ...

最新文章

  1. 03_Android项目中读写文本文件的代码
  2. Podfile grammar
  3. Shell入门(三)之字符串
  4. 您在2016年OpenStack峰会上错过的事情
  5. mvc 一般注释_使用带有注释和JQuery的Spring MVC 3的Ajax
  6. 禅道开源版用户手册_Docker搭建开源版禅道以及项目基本流程介绍
  7. docker 及 docker-compose 的快速安装和简单使用
  8. 《Cracking the Coding Interview》——第3章:栈和队列——题目4
  9. JAVA中“:”的用法详解
  10. 2网口全网通4G工业路由器特点
  11. 在EnableQ创建一张问卷
  12. 解决 IDEA 导入项目 中文乱码
  13. Ae:时间轴面板(时间线区域)
  14. 万字长文!用文本挖掘深度剖析54万首诗歌
  15. 百度地图、腾讯地图坐标转换
  16. 三星手机android版本怎么升级,如何在三星Galaxy手机上更新软件
  17. 高级语言与低级语言如何定义?解释型语言和编译型语言又如何区别?
  18. 中国OpenAI?李志飞放弃了;AutoGPT试玩指南;AI大时代的家长完整手册;电商数字模特生成实践 | ShowMeAI日报
  19. 字符串——OKR-Periods of Words(kmp求最短相同前后缀或者说求最长循环节)
  20. Go语言Win10环境配置

热门文章

  1. Linux如何解决动态库的版本控制
  2. 【Dijkstra】最短路径
  3. UWP crop image control
  4. PHP array_key_exists() 函数(判断某个数组中是否存在指定的 key)
  5. [JDBC技术]3.JDBC数据库连接池实例
  6. 互联网协议 — TLS — CA 认证
  7. Linux 操作系统原理 — Namespace 资源隔离
  8. 第五个页面:更多电影页面
  9. 浏览器history操作实现一些功能
  10. SQLServer · 最佳实践 · RDS for SQLServer 2012权限限制提升与改善