用过JPA的都知道,只需要继承JpaRepository 根据Jpa的函数命名规范写出接口中的函数,不需要实现,底层就可以自动解析成各种数据库的sql语句,进行增删改查等操作。

自定义简单的查询方法

如findByUserName,findByUserNameOrEmail(String username, String email)等条件的属性名称与个数要与参数的位置与个数一一对应,JpaRepository能够解析方法名自动生成sql语句,主要的语法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy后面跟属性名称即可,

关键词 举例 对应的sql语句
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age ⇐ ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection age) … where x.age not in ?1
TRUE findByActiveTrue() … where x.active = true
FALSE findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

这种方式很简单,但也有很多缺陷,不够灵活,不用担心,Spring data jpa还支持自定义查询语句。

  • 使用 @Query注解,添加JPQL语句,JPQL是一种面向对象的表达式语言,通过类名和属性访问,而不是数据库中的表名和属性,避免了不同数据库语法的不同。
  • 在@Query中添加nativeQuery = true表示使用原生的sql语句,这时候就有要使用数据库表名和字段名了。
  • 当涉及到删除和修改在需要加上@Modifying.也可以根据需要添加 @Transactional对事物的支持,查询超时的设置等。

使用JPA命名规范写的函数能够查询出整个对象,而不能只查询出一个或几个字段,因为有时候我们只需要一个bean中的几个字段就够了,不需要全部的。

例如用户表,根据id查姓名,就不需要把密码等重要信息查出来了,因为这些信息封装在一个对象中返回到前端是很危险的,即使没有显示,但也可以在浏览器上调试看到。

原生的sql当然可以做到,但是我们还想让查询出的结果封装成一个对象,以便后续的操作。

那么自定义的JPQL就可以实现这个功能了。
例如有一个用户表,如下:


@Entity
@Table(name = "yhb")
public class YHB {//用户编号@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer yhbh;//用户代码(名字拼音缩写)private String yhdm;//用户名称private String yhmc;//用户密码private String yhkl;//用户部门编号private String yhbm;//用户职务private String yhsf;//用户手机号private String phone;//省略构造函数和get set

现在需要根据部门编号查询出这个部门所有人的用户编号用户名称,那么我们可以新建一个Model,就只有用户编号用户名称这两个字段:
YhbModel.java

public class YhbModel implements Serializable {private Integer yhbh;//用户名称private String yhmc;

在用户表的dao层可以这样写操作数据库的方法:

@Repository
public interface YhbDao extends JpaRepository<YHB,Integer>{//根据部门查找用户@Transactional@Query(value = "select new com.nju.software.assessment.model.YhbModel(y.yhbh,y.yhmc) from YHB y where yhbm=?1")List<YhbModel> findYhmcByYhbm(String yhbm);
}

@Query中的JPQL意思是根据用户部门编号yhbm查询用户的实体类YHB中的用户编号yhbh用户名称yhmc,并把查询出的结果封装成一个YhbModel对象,List<YhbModel>中类型也是YhbModel类型的,之后的service层和controller层调用的时候返回类型也是List<YhbModel>

SpringBoot使用JPA如何查询部分字段相关推荐

  1. SpringBoot整合JPA 数据库自动增加字段问题记录

    Spring整合JPA启动的时候忽然发现,数据增加了两个字段,我当时就很纳闷了,我自己写的有实体有字段,并且跟数据一致,为什么要给我增加两个字段哪? 我的实体如下: 启动的时候就变成这样了 然后就找度 ...

  2. SpringBoot使用JPA多表关联动态查询指定字段

    SpringBoot使用JPA多表关联动态查询指定字段 目标需求 Maven依赖 项目结构 代码 运行结果 源码下载 目标需求 在SpringBoot中用JPA实现多表关联动态查询,并且只查询指定字段 ...

  3. spring data jpa 查询自定义字段,转换为自定义实体

    目标:查询数据库中的字段,然后转换成 JSON 格式的数据,返回前台. 环境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2  背景:首先建立 ...

  4. 【SpringBoot Data JPA】多表关联查询

    SpringBoot Data JPA 多表关联查询 前言 一.数据库架构设计 1.1 数据表结构 2.2 建立数据库表: 二.SpringBoot整合JPA多表查询 2.1 环境配置 2.2 建立数 ...

  5. JPA查询单个字段和多个字段返回类型总结

    在使用springboot中,需要使用JPQL和SQL去查询记录. 获取一整条记录,返回的类型就是对应的实体类或者实体类的集合. 当不是全部字段时,返回类型就不能是实体类了. 以下是用JPQL和SQL ...

  6. springboot mongo查询固定字段_你真的会用索引么?[Mongo]

    一次奇怪的查询经历 如何奇怪了? 对同一张表,用同样的SQL,查询200万条数据耗时100ms,查询二十条数据却耗时30s. 数据量少了10万倍,完全不是一个数量级的数据,耗时却多了300倍. 明明加 ...

  7. SpringBoot ES 查询空字段

    参考文章:Elasticsearch 字段为空(null)记录查询 - illusioned - 博客园 /*** 查询空字段*/ public void searchNullField() {Nat ...

  8. 【Other】最近在研究的, Java/Springboot/RPC/JPA等

    我的Springboot框架,欢迎关注: https://github.com/junneyang/common-web-starter Dubbo-大波-服务化框架 dubbo_百度搜索Dubbo与 ...

  9. Jpa第一话 -- Springboot集成Jpa和Mybatis以及Jpa的最全使用

    本文主要记录spring-boot-starter-data-jpa的详细使用. 在做一些小型无并发的项目时,说实话第一个想到的就是Jpa,一个Entity走天下. 1.Spring Jpa的使用 基 ...

最新文章

  1. JQuery的ready函数与JS的onload的区别详解
  2. MIPI CSI-2学习
  3. [Java基础]线程基础与实现多线程
  4. js用ajax和不同页面的php互相传值的方法
  5. Oracle 触发器 判断
  6. 如何学web前端-几款前端小游戏推荐
  7. Ubuntu 20.04 无连接图标无网络问题
  8. MATLAB的输入与输出
  9. 在c++和C中,malloc函数的头文件是什么?C头文件, <stdlib.h>;C++头文件, <cstdlib>
  10. Tools - UML绘图工具
  11. 什么是视频网站CDN呢?视频网站使用了视频CDN有什么优势?
  12. 芯片设计流程介绍(从硬件设计语言到芯片制造)
  13. 学习笔记61—兴趣阅读之经济学
  14. 独立元器件搭建的逻辑门电路和仿真(一)
  15. selenium自动化测试随笔,安装selenium
  16. 初学者制作自己的网站详细流程(可以上传自己做的网页)
  17. 机关里看似讨巧实则毁人设的8种行为
  18. 【大数据】医疗大数据“九大业务应用”相关研究
  19. JavaFx笔记二:布局
  20. 玩转Mysq数据库(一):数据库的基础操作——创建、删除、查看

热门文章

  1. 关于【星图地球开发者平台】里地球组件的基本使用方法
  2. 计算机毕业过程,计算机毕业论文答辩过程及要求
  3. WebRTC音频处理流程概述
  4. 顶级python程序员 知乎_月薪30k的资深程序员用Python爬取了知乎百万用户!并数据分析!...
  5. 2021年美容师(中级)考试报名及美容师(中级)模拟考试
  6. Arduino中的滑动开关和按钮开关
  7. Labview 用DBC文件解析CAN报文以及DBC格式发送CAN,调用的dll有说明文档
  8. 在线客服软件海豚客服APP接入方法一:安卓篇
  9. 如何安装eve和pnet(安装教程)
  10. ssm+jsp计算机毕业设计作业管理系统ctoc8(程序+lw+源码+远程部署)