SpringBoot使用JPA实现查询部分字段

 更新时间:2021年08月27日 10:40:58   作者:静幽水1  
这篇文章主要介绍了SpringBoot使用JPA实现查询部分字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBoot JPA查询部分字段

用过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>。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java基础知识精通循环结构与break及continue

    Java基础知识精通循环结构与break及continue

    循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环,选择结构用于判断给定的条件,根据判断的结果判断某些条件,根据判断的结果来控制程序的流程
    2022-04-04
  • SpringBoot集成cache缓存的实现

    SpringBoot集成cache缓存的实现

    日常开发中,缓存是解决数据库压力的一种方案,本文记录springboot中使用cache缓存。需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Spring多数据源导致配置失效的解决

    Spring多数据源导致配置失效的解决

    这篇文章主要介绍了Spring多数据源导致配置失效的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java学习之jar包的下载和导入

    java学习之jar包的下载和导入

    我们经常碰到有些jar包在中央仓库没有的情况,这时候我们需要导入,这篇文章主要给大家介绍了关于java学习之jar包的下载和导入的相关资料,需要的朋友可以参考下
    2023-06-06
  • java用重定向方法从文件中读入或写入数据

    java用重定向方法从文件中读入或写入数据

    这篇文章主要为大家详细介绍了用重定向方法从文件中读入或写入数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Spring与Mybatis的整合方法有哪些

    Spring与Mybatis的整合方法有哪些

    本文主要给大家介绍Spring与Mybatis的三种常用整合方法,需要用到的整合框架包mybatis-spring.jar,对spring mybatis整合感兴趣的朋友可以参考下本文
    2015-10-10
  • javaWeb使用验证码实现简单登录

    javaWeb使用验证码实现简单登录

    这篇文章主要为大家详细介绍了javaWeb使用验证码实现简单登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 浅谈SpringMVC中的session用法及细节记录

    浅谈SpringMVC中的session用法及细节记录

    下面小编就为大家带来一篇浅谈SpringMVC中的session用法及细节记录。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringSecurity在SpringBoot中的自动装配过程

    SpringSecurity在SpringBoot中的自动装配过程

    这篇文章主要介绍了SpringSecurity在SpringBoot中的自动装配过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java实现图片拼接

    Java实现图片拼接

    这篇文章主要为大家详细介绍了Java实现图片拼接的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08

最新评论