【Spring Data 系列学习】Spring Data JPA @Query 注解查询
【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.xml、application.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 注解查询的更多相关文章
- SpringData系列四  @Query注解及@Modifying注解
		
@Query注解查询适用于所查询的数据无法通过关键字查询得到结果的查询.这种查询可以摆脱像关键字查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring Data的特有实现. ...
 - SpringData系列四 @Query注解及@Modifying注解@Query注解及@Modifying注解
		
@Query注解查询适用于所查询的数据无法通过关键字查询得到结果的查询.这种查询可以摆脱像关键字查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring Data的特有实现. ...
 - 【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 ...
 - Spring Data JPA 常用注解 @Query、@NamedQuery
		
1.@Transient @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性:如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架 ...
 - 通过JPA注解映射视图的实体类   jpa  视图  无主键   @Query注解的用法(Spring Data JPA)  jpa 使用sql语句
		
参考: https://blog.csdn.net/qq465235530/article/details/68064074 https://www.cnblogs.com/zj0208/p/6008 ...
 - @Query注解的用法(Spring Data JPA)
		
参考文章:http://www.tuicool.com/articles/jQJBNv 1. 一个使用@Query注解的简单例子 @Query(value = "select name,au ...
 - Spring Data JPA之@Query注解
		
比如有个实体类对象,类名为Book,对应数据表的表名为book 1. 一个使用@Query注解的简单例子:占位符?1和?2 @Query(value = "select name,autho ...
 - spring data jpa @query的用法
		
@Query注解的用法(Spring Data JPA) 参考文章:http://www.tuicool.com/articles/jQJBNv . 一个使用@Query注解的简单例子 @Query( ...
 - 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate
		
在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...
 
随机推荐
- HashMap、Hashtable、ConcurrentHashMap、ConcurrentSkipListMap对比及java并发包(java.util.concurrent)
			
一.基础普及 接口(interface) 类(class) 继承类 实现的接口 Array √ Collection √ Set √ Collection List √ Collection Map ...
 - mysql索引详细介绍
			
博客: https://blog.csdn.net/tongdanping/article/details/79878302#%E4%B8%89%E3%80%81%E7%B4%A2%E5%BC%95% ...
 - python3多线程应用详解(第一卷:线程的本质概念)
			
之前我用过多线程的方式执行了爬虫程序,爬取了糗事百科的数据可以看到速率非常之快,就像正常一个人他要完一个汉堡,再吃喝一瓶水才能走,结果他边吃汉堡边喝水,速率一下加快了一样.首先我们看看什么是线程: 图 ...
 - 浮动框架iframe
			
浮动框架式一种比较特别的框架,和frame比较类似.不过frame必须在frameset中才可以,而iframe不一样,首先, 他是一种内联框架,其次,他可以放在网页中的任何位置. 所以,iframe ...
 - Java中的Properties类
			
目录 Java中的Properties类 前言 主要方法 读取Properties文件 相关实例 Java中的Properties类 前言 Java中的Properties类属于配置文件,以键值对的方 ...
 - HTML面试题&知识点汇总
			
目录 问题&答案 参考资料 结束语 问题&答案 DOCTYPE作用?标准模式与兼容模式各有什么区别? 声明位于HTML文档中的第一行,处于 html 标签之前.告知浏览器的解析器用什么 ...
 - Python-多任务复制文件夹
			
import multiprocessing import os import time def copy_file(queue, file_name, old_folder_name, new_fo ...
 - 18.09.22模拟赛T2 历史
			
网上基本上找不到这道题,何况LJJ还稍微改了一下...... 原题:传送门 题目描述 ljj 被S 国数不清的漂亮小姐姐所吸引,为了搞清楚为什么S 国有如此多的漂亮小姐姐,他决定研究S 国的历史. 根 ...
 - JAVA WEB期末项目第二阶段成果
			
我们做的系统是一个基于Java web与MySQL的食堂订餐系统 班级: 计科二班 小组成员:李鉴宣.袁超 1.开发环境 开发编辑器使用:Visual Studio Code 数据库使用:MySQL8 ...
 - python标准库-array 模块
			
原文地址:http://www.bugingcode.com/blog/python_module_array.html array 模块是python中实现的一种高效的数组存储类型.它和list相似 ...