Spring Data JPA 从入门到精通~@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 "";
}

@Query 用法

使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效。一般只需要关心 @Query 里面的 value 和 nativeQuery 的值。使用声明式 JPQL 查询有个好处,就是启动的时候就知道你的语法正确不正确。

注意:好的架构师写代码时报错的顺序是编译<启动<运行时,即越早发现错误越好。默认 value 里面是 JPQL 语法,既对象查询和 SQL、HQL 比较类似。

案例 4.1:声明一个注解在 Repository 的查询方法上。

public interface UserRepository extends JpaRepository<User, Long>{@Query("select u from User u where u.emailAddress = ?1")User findByEmailAddress(String emailAddress);
}

案例 4.2:Like 查询,注意 firstname 不会自动加上 % 关键字。

public interface UserRepository extends JpaRepository<User, Long> {@Query("select u from User u where u.firstname like %?1")List<User> findByFirstnameEndsWith(String firstname);
}

案例 4.3:直接用原始 SQL。

public interface UserRepository extends JpaRepository<User, Long> {@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)User findByEmailAddress(String emailAddress);
}

注意:nativeQuery 不支持直接 Sort 的参数查询。

案例4.4:nativeQuery 的排序错误的写法,下面这个是启动不起来的。

public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "select * from user_info where first_name=?1",nativeQuery = true)
List<UserInfoEntity> findByFirstName(String firstName,Sort sort);
}

案例4.5:nativeQuery 排序的写法。

@Query(value = "select * from user_info where first_name=?1 order by ?2",nativeQuery = true)
List<UserInfoEntity> findByFirstName(String firstName,String sort);
//调用的地方写法last_name是数据里面的字段名,不是对象的字段名
repository.findByFirstName("jackzhang","last_name");

@Query 的排序

@Query 的 JPQL 情况下,想实现排序,方法上面直接用 PageRequest 或者直接用 Sort 参数都可以做到。

在排序实例中实际使用的属性需要与实体模型里面的字段相匹配,这意味着它们需要解析为查询中使用的属性或别名。这是一个state_field_path_expression JPQL定义,并且 Sort 的对象支持一些特定的函数。

案例 4.6:Sort and JpaSort 的使用。

public interface UserRepository extends JpaRepository<User, Long> {@Query("select u from User u where u.lastname like ?1%")List<User> findByAndSort(String lastname, Sort sort);@Query("select u.id, LENGTH(u.firstname) as fn_len from User u where u.lastname like ?1%")List<Object[]> findByAsArrayAndSort(String lastname, Sort sort);
}
//调用方的写法,如下:
repo.findByAndSort("lannister", new Sort("firstname"));               
repo.findByAndSort("stark", new Sort("LENGTH(firstname)"));          
repo.findByAndSort("targaryen", JpaSort.unsafe("LENGTH(firstname)"));
repo.findByAsArrayAndSort("bolton", new Sort("fn_len")); 

@Query 的分页

案例 4.7:直接用 Page 对象接受接口,参数直接用 Pageable 的实现类即可。

public interface UserRepository extends JpaRepository<User, Long> {@Query(value = "select u from User u where u.lastname = ?1")Page<User> findByLastname(String lastname, Pageable pageable);
}
//调用者的写法
repository.findByFirstName("jackzhang",new PageRequest(1,10));

案例 4.8:对原生 SQL 的分页支持,案例如下,但是支持的不是特别友好,以 MySQL 为例。

 public interface UserRepository extends JpaRepository<UserInfoEntity, Integer>, JpaSpecificationExecutor<UserInfoEntity> {@Query(value = "select * from user_info where first_name=?1 /* #pageable# */",countQuery = "select count(*) from user_info where first_name=?1",nativeQuery = true)Page<UserInfoEntity> findByFirstName(String firstName, Pageable pageable);
}
//调用者的写法
return userRepository.findByFirstName("jackzhang",new PageRequest(1,10, Sort.Direction.DESC,"last_name"));
//打印出来的sql
select  *   from  user_info  where  first_name=? /* #pageable# */  order by  last_name desc limit ?, ?

注意:

  • 这个注释 /* #pageable# */ 必须有;
  • 估计有可能随着版本的变化这个会做优化。
  • 另外一种实现方法就是自己写两个查询方法,自己手动分页。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的mapreduce没了_MapReduce的过程总结

MapReduce 分为&#xff1a;1) MapTask :1.Read阶段&#xff1a;逻辑切片 128M / Maptask 读数据解析出一个个key/value。2.Map阶段&#xff1a; 把key/value 写入到map中去(处理业务逻辑)3.Collect阶段&#xff1a;将生成的key/value分区(调用Partitioner)排序&#xff0c;并写…

酒桌上的规矩,社会的潜规则

(一)如果自己真不能喝&#xff0c;丫就别开第一口&#xff0c;端着饭碗夹了菜一边吃着去(二)如果确信自己要喝&#xff0c;就别装墨迹&#xff0c;接下来就是规矩了  规矩一&#xff1a;酒桌上虽然“感情深&#xff0c;一口闷&#xff1b;感情浅&#xff0c;舔一舔”但是喝酒…

7个方面读懂6月的5G标准

来源&#xff1a;5G丨公众号作为IMT2020主要的候选技术&#xff0c; 5GNR在3GPP的快马加鞭地统一协调下急速前行&#xff0c;按照计划&#xff0c;今年第一个5G标准会冻结&#xff0c;将为运营商提供一套5G初期部署的可行方案。5GNR 是5G New Radio的简称&#xff0c;是当今通信…

Linux进制查看工具:od、hexdump、xxd

od 命令 &#xff1a;http://man.linuxde.net/od od 命令 od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示&#xff0c;通常使用od命令查看特殊格式的文件内容&#xff0c;或者用于显示或查看文件中不能直接显示在终端的字符。 od命令系…

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

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

园子里关于罗辑树与视觉树的文章

http://www.cnblogs.com/YilingLai/archive/2006/12/22/600279.html转载于:https://www.cnblogs.com/refeiner/archive/2009/04/18/1438950.html

专家谈计算机体系架构研究获“图灵奖”

来源&#xff1a;科学网 作者&#xff1a;王佳雯 韩扬眉近日&#xff0c;有着“计算机界的诺贝尔奖”之称的“图灵奖”揭开面纱。国际计算机协会宣布&#xff0c;美国科学家约翰轩尼诗和大卫帕特森获得2017年度图灵奖&#xff0c;以表彰二人开创了一种系统的、可量化的方法用…

编译和使用APUE的源码

From&#xff1a;http://blog.csdn.net/mitesi/article/details/19015397 APUE说明及源码下载地址 &#xff1a;http://www.apuebook.com/ APUE 电子版 PDF 下载地址&#xff1a;http://download.csdn.net/download/freeking101/10012610 1. 介绍 总结&#xff1a;APUE是一本…

java标签用法详解_介绍一个javaWeb自定义标签的用法详解

这篇文章主要介绍了javaWeb自定义标签用法,结合实例形式分析了javaweb自定义标签的功能、定义方法及执行原理,需要的朋友可以参考下本文实例讲述了javaWeb自定义标签用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;自定义标签创建自定义标签主要用于移除Jsp页面中…

Spring Data JPA 从入门到精通~SpEL表达式的支持

在 Spring Data JPA 1.4 以后&#xff0c;支持在 Query 中使用 SpEL 表达式&#xff08;简介&#xff09;来接收变量。 SpEL 支持的变量 变量名 使用方式 描述 entityName select x from #{#entityName} x 根据指定的Repository自动插入相关的entityName 有两种方式能被解…

由partition看窗口函数

最近要完成一个项目&#xff0c;有一个查询可难住了笔者&#xff0c;无论是子查询还是分组&#xff0c;都没弄出来&#xff0c;还是基础知识不行啊。不过呢&#xff0c;可以查资料&#xff0c;最后用一个窗口函数解决了问题。由于开始的数据库是Access&#xff0c;后来笔者导成…

AI版「盗梦空间」?谷歌大脑「世界模型」可实现在其梦境中对智能体进行训练

图源&#xff1a;pixabay原文来源&#xff1a;arXiv原文链接&#xff1a;https://arxiv.org/pdf/1803.10122.pdf作者&#xff1a;David Ha、Jurgen Schmidhuber「雷克世界」编译&#xff1a;嗯~是阿童木呀、KABUDA我们探索构建通用强化学习环境中的生成式神经网络模型。我们的世…

Linux文件空洞与稀疏文件

From&#xff1a;http://www.topjishu.com/8277.html From&#xff1a;http://blog.csdn.net/clamercoder/article/details/38361815 Linux_File_Hole_And_Sparse_Files 参考unix环境高级编程第三版 54页和90页&#xff01;&#xff01;&#xff01; ( 文件I/O章节 lseek…

Spring Data JPA 从入门到精通~@Modifying修改查询

学习思路一样&#xff0c;我们先看源码&#xff1a; public interface Modifying { //如果配置了一级缓存&#xff0c;这个时候用clearAutomaticallytrue,就会刷新hibernate的一级缓存了&#xff0c; 不然你在同一接口中&#xff0c;更新一个对象&#xff0c;接着查询这个对象…

java volatile修饰引用_关于volatile修饰引用类型的疑惑

volatile修饰引用类型能否保证可见性似乎一直没有一个定论&#xff0c;有的书中说仅能保证引用本身的可见性&#xff0c;下面用两段代码来验证&#xff1a;流程基本为一个线程死循环读取某个引用类型的某个变量的值&#xff0c;另一个线程修改这个值&#xff0c;观察线程是否结…

gridview 简单的分页

allowpaging 设为 true 然后 后台代码为&#xff1a; protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridView1.PageIndex e.NewPageIndex; Get_Gridview(); } Get_Gridview();是绑定gridview 的方法 转载于:https…

西人马聂泳忠:打造机器神经系统,成为中国的特斯拉

作者&#xff1a;于绍洋 来源&#xff1a;投资家网经常穿梭于几个城市&#xff0c;一手拉着行李箱&#xff0c;一手忙于回复工作上的事务&#xff0c;这可能已经成为西人马FATRI&#xff08;下称&#xff0c;西人马&#xff09;创始人聂泳忠博士的日常状态。他给人的第一印象…

Linux dd 命令

From&#xff1a;http://www.cnblogs.com/jikexianfeng/p/6103500.html Linux/UNIX: 使用 dd 命令创建 1GB 大小的二进制&#xff1a;http://www.linuxidc.com/Linux/2014-12/110147.htm 菜鸟教程 Linux dd命令&#xff1a;http://www.runoob.com/linux/linux-comm-dd.html …

Ubuntu 20.04 (Focal Fossa) 上安装RabbitMQ和Erlang,并配置管理员,并且修改数据目录

本脚本适用于在Ubuntu 20.04 (Focal Fossa) 上在线快速安装RabbitMQ和Erlang。 快速安装脚本&#xff1a; #!/bin/shsudo apt-get install curl gnupg apt-transport-https -y## Team RabbitMQs main signing key curl -1sLf "https://keys.openpgp.org/vks/v1/by-finge…

javascript indexOf函数

使用方法&#xff1a;strObj.indexOf(str,startIndex[可选]) 程序代码 其中strObj是必选项。String 对象或文字。 str是必选项。要在 String 对象中查找的子字符串。 startIndex是可选项。该整数值指出在 String 对象内开始查找的位置&#xff0c;从0开始。如果省略&#xff0c…