【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 ...
随机推荐
- MySQL 之全文索引
最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录. 引入概念通过数值比较.范围过滤等就可以 ...
- 第十六届“二十一世纪的计算”学术研讨会 图灵奖获得者Butler W. Lampson主题演讲
Personal Control of Digital Data 图灵奖获得者Butler W. Lampson主题演讲" title="第十六届"二十一世纪的计算&qu ...
- spring参数拼装
-- 知道轮子是怎么造的 -- 自己试着造一造轮子 ,这样才可以更好地利用轮子,轮子的缺陷和优点才能明确. spring参数拼装,需要用到set函数,参考文档: http://coderec.cn/2 ...
- Navicat导入导出数据表
当我们对mysql数据库进行了误操作,造成某个数据表中的部分数据丢失时,肯定就要利用备份的数据库,对丢失部分的数据进行导出.导入操作了.Navicat工具正好给我们提供了一个数据表的导入导出功能. 1 ...
- JavaScript常见排序算法
1.冒泡排序 function bubble_sort(arr) { if (arr.length <= 1) { return arr; } var len = arr.length; for ...
- Jmeter之Beanshell---使用Java处理JSON块
原文出处:https://www.cnblogs.com/xpp142857/p/7374281.html [环境] ①Jmeter版本:3.1,JDK:1.7 ②前置条件:将json.jar包置于. ...
- 使用 Hexo 在 GitHub 上建立博客 · Utopia's Daily Note
使用 Hexo 在 GitHub 上建立博客 # 写在前面 其实我在一月份的就开始写了三篇博客文章,你没有看错,只是写了三篇,然后,就没有然后了.我还在其中一篇文章中写着,不知道自己能够坚持多久.事实 ...
- Android API Levels
Android API Levels(转) 在本文中 API的级别是什么? 在Android中使用API级别 开发者需要考虑的内容 应用程序的向前兼容性 应用程序的向后兼容性 平台版本和API级别的选 ...
- Nginx_安装
1. 安装步骤 上传nginx上传nginx安装包到linux 安装gcc 1 yum -y install gcc-c++ gcc 查看是否安装gcc: 1 gcc -v 安装依赖库 1 yum - ...
- 爬虫入门(四):urllib2
主要使用python自带的urllib2进行爬虫实验. 写在前面的蠢事:本来新建了一个urllib2.py便于好认识这是urllib2的实验,结果始终编译不通过,错误错误.不能用Python的关键字( ...