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

前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作。但同时 JPA 还提供通过注解的方式实现,通过将 @Query 注解在继承 repository 的接口类方法上 。

Query 源码讲解

public @interface Query {
/**
* 指定 JPQL 的查询语句。(nativeQuery = true)是原生的 SQL 语句.
*/
String value() default "";
/**
* 指定 count 的 JPQL 语句,如果不指定将根据 query 自动生成。
* (nativeQuery = true 的时候,是原生查询的 SQL 语句)
*/
String countQuery() default "";
/**
*根据那个字段来 count,一般默认即可。
*/
String countProjection() default "";
/**
* 默认是 false,表示 value 里面是不是原生的 SQL 语句
*/
boolean nativeQuery() default false;
/**
* 可以指定一个 query 的名字,必须是唯一的。
* 如果不指定,默认的生成规则是
* {$domainClass}.${queryMethodName}
*/
String name() default "";
/**
* 可以指定一个 count 的query 名字,必须是唯一的。
* 如果不指定,默认的生成规则是:
* {$domainClass}.${queryMethodName}.count
*/
String countName() default "";
}

快速上手

项目中的pom.xmlapplication.properties与 Chapter1 相同

实体类映射数据库表

user 实体类

@Entity
@Table(name = "t_user")
public class User implements Serializable { private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; @Column(name = "u_name")
private String name; @Column(name ="u_age")
private Integer age; @Column(name ="u_email")
private String email; // 省略构造器 set/get }

@Entity:定义对象将会成为被JPA管理的实体,将映射到指定的数据库表。

@Table :指定数据库的表名。

@Column:定义该属性对应数据库中的列名。

@Id 定义属性为数据库的主键,一个实体里面必须有一个。

@GeneratedValue(strategy = GenerationType.IDENTITY) 自增长 ID 策略

生成如下:

@Query 查询

基本使用

继承 UserQueryRepository


public interface UserQueryRepository extends JpaRepository<User, Long> { /**
* 语句中 User 查询数据表的类名,?1 括号代表第一个参数
*/
@Query(name = "select * from User where name = ?1")
List<User> findByName(String name); /**
* Sort 排序
* 根据姓名模糊查询排序
*/
@Query("select u from User u where u.name like ?1%")
List<User> findByAndSort(String name, Sort sort); /**
* @Transactional 事务的支持 ,@Modifying 用于修改查询
* @param name 对应 ?1
* @param id 对应 ?2
* @return
*/
@Transactional
@Modifying
@Query("update User u set u.name = ?1 where u.id = ?2")
int updateById(String name, Long id); }

@Param用法

    /**
* param 对象
* @param name
* @param age
* @return
*/
@Query(value = "select u from User u where u.name = :name and u.age = :age")
List<User> queryParamByNameAndAge(@Param("name") String name,@Param("age") Integer age); /**
* 传一个对象
* @param user
* @return
*/
@Query(value = "select u from User u where u.name = :#{#user.name} and u.age = :#{#user.age}")
List<User> queryObjectParamByNameAndAge(@Param("user") User user);
  • :name 对应 @Param中的 name。

  • :age 对应 @Param中的 age。

  • :#{#user.name} : 对象中的参数使用方法

SpEL表达式

@Query("select u from #{#entityName} u where u.lastname = ?1")
List<User> findByLastname(String lastname);
  • entityName: 根据指定的 Repository 自动插入相关的 entityName。有两种方式能被解析出来:

    • 如果定义了 @Entity 注解,直接用其属性名。
    • 如果没有定义,直接用实体类的名称。

原生 SQL

    @Query(value = "select * from t_user  where u_name = :name",nativeQuery = true)
List<User> queryNativeByName(@Param("name") String name);
  • nativeQuery: 为 true 开启。开启之后字段则需要对应的数据库中的表名和字段。

CURD 测试类

路径:src/test/java/com/mtcarpenter/repository/UserQueryRepositoryTest.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserQueryRepositoryTest { /**
* ⽇志对象
*/
private Logger logger = LoggerFactory.getLogger(UserQueryRepositoryTest.class); @Autowired
private UserQueryRepository userQueryRepository; @Before
public void save() {
logger.info("新增数据 result = {}", userQueryRepository.save(new User("小米", 9, "a@qq.com")));
logger.info("新增数据 result = {}", userQueryRepository.save(new User("张三", 16, "b@qq.com")));
logger.info("新增数据 result = {}", userQueryRepository.save(new User("三哥", 12, "c@qq.com")));
logger.info("新增数据 result = {}", userQueryRepository.save(new User("米二", 13, "e@qq.com")));
logger.info("新增数据 result = {}", userQueryRepository.save(new User("阿三", 12, "f@qq.com")));
logger.info("新增数据 result = {}", userQueryRepository.save(new User("张三", 12, "g@qq.com")));
logger.info("新增数据 result = {}", userQueryRepository.save(new User("米二", 8, "h@qq.com")));
} /**
* 基本使用
*/
@Test
public void test() {
logger.info("@query 查询张三 result = {}", userQueryRepository.findByName("张三"));
logger.info("根据姓名模糊查询排序 result = {}", userQueryRepository.findByNameAndSort("米", new Sort(Sort.Direction.ASC,"age")));
logger.info("修改 id = 1 的name ,result ={ }", userQueryRepository.updateById("红米", 1L));
} /**
* param 参数使用
*/
@Test
public void paramTest(){
logger.info("@param 使用方法 result = {}",userQueryRepository.queryParamByNameAndAge("张三", 12));
User user = new User();
user.setName("张三");
user.setAge(12);
logger.info("@Param 对象 result = {}", userQueryRepository.queryObjectParamByNameAndAge(user));
} /**
* SpEl 使用
*/
@Test
public void spELTest(){
logger.info("SpEL 使用方法 result = {}",userQueryRepository.queryELByName("张三"));
} /**
* 原生查询
*/
@Test
public void nativeTest(){
logger.info("原生查询 使用方法 result = {}",userQueryRepository.queryNativeByName("张三")); }
}

本章代码

【Spring Data 系列学习】Spring Data JPA @Query 注解查询的更多相关文章

  1. SpringData系列四 @Query注解及@Modifying注解

    @Query注解查询适用于所查询的数据无法通过关键字查询得到结果的查询.这种查询可以摆脱像关键字查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring Data的特有实现. ...

  2. SpringData系列四 @Query注解及@Modifying注解@Query注解及@Modifying注解

    @Query注解查询适用于所查询的数据无法通过关键字查询得到结果的查询.这种查询可以摆脱像关键字查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring Data的特有实现. ...

  3. 【spring data jpa】repository中使用@Query注解使用hql查询,使用@Param引用参数,报错:For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on

    在spring boot中, repository中使用@Query注解使用hql查询,使用@Param引用参数 如题报错: For queries with named parameters you ...

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

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

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

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

  6. @Query注解的用法(Spring Data JPA)

    参考文章:http://www.tuicool.com/articles/jQJBNv 1. 一个使用@Query注解的简单例子 @Query(value = "select name,au ...

  7. Spring Data JPA之@Query注解

    比如有个实体类对象,类名为Book,对应数据表的表名为book 1. 一个使用@Query注解的简单例子:占位符?1和?2 @Query(value = "select name,autho ...

  8. spring data jpa @query的用法

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

  9. 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate

    在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...

随机推荐

  1. JVM如何判断对象能否被回收

    •写在前面说起Java和C++,很容易想到让人疯狂的指针,Java使用了内存动态分配和垃圾回收技术,让我们从C++的各种指针问题中摆脱出来,更加专心于业务逻辑,不过如果我们需要深入了解java的JVM ...

  2. django框架进阶-中间件-长期维护

    ##################    为什么使用中间件?      ####################### 先说几个需求, 1,url的白名单,url=[ "XX"] ...

  3. jquery框架概览(一)

    参照jQuery 2.0.3版本(http://files.cnblogs.com/files/snoy/jquery-2.0.3.js")来进行的源码分析 从代码的最外层可以看到是一个II ...

  4. PLL到底是个啥么东西呢?

    ——————————————————更新于20180826———————————————————————————— PLL:完成两个电信号的相位同步的自闭环控制系统叫锁相环.用电压控制延时,用到了VC ...

  5. ArrayList查找和添加元素问题

    问题描述: 如上图所示,如果依靠迭代器在List中查找元素并添加元素,会报错:java.util.ConcurrentModificationException原因是在添加元素后,List本身发生了变 ...

  6. TortoiseSVN配置和使用教程

    2009-04-24 来源:dev.idv.tw 1 安装及下载client 端 2 什么是SVN(Subversion)? 3 为甚么要用SVN? 4 怎么样在Windows下面建立SVN Repo ...

  7. SpringMVC学习笔记二:参数接受

    该项目用来介绍SpringMVC对参数接受的方法: 项目目录树:在前一个项目上修改添加 新添加了Student类和Group类,用来测试整体参数接受 Student.java package com. ...

  8. 吴裕雄--天生自然 R语言开发学习:功效分析(续一)

    #----------------------------------------# # R in Action (2nd ed): Chapter 10 # # Power analysis # # ...

  9. TCP并发、GIL全局锁、多线程讨论

    TCP实现并发 #client客户端 import socket client = socket.socket() client.connect(('127.0.0.1',8080)) while T ...

  10. WiFi曝出安全漏洞几近“裸奔”:运营商能借机收割一波红利吗?

    ​    作为大众生活中不可或缺的基础架构,也是智能生活普及的推动性力量,运营商的重要性毋庸置疑.但无奈的是,一直以来运营商都似乎是站在了大众的"对立面".看似光鲜亮丽,但在壮观的 ...