热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

SpringDataJpa的四种查询方式详解

这篇文章主要介绍了SpringDataJpa的四种查询方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Spring Data Jpa的四种查询方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、调用接口的方式

1.基本介绍

通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口

public interface UserDao extends JpaRepository, JpaSpecificationExecutor

使用这几种方法的前提是你定义的实体类必须标注上相应的注解

@Entity //标注这是一个实体类
@Table(name = "tbl_user") //建立实体类与表的映射关系
public class User {

  @Id //声明此属性为主键
  @GeneratedValue(strategy = GenerationType.IDENTITY) //主键生成策略,自增
  @Column(name = "user_id")//指定属性对应数据库表的列名
  private Integer userId;

  @Column(name = "user_name")
  private String userName;

  @Column(name = "user_address")
  private String userAddress;

  @Column(name = "user_salary")
  private Double userSalary;
  
  //...getter setter toString方法
}

JpaRepository

第一个接口里面定义了一些简单的CRUD方法,泛型T是你定义的实体类的类型,泛型ID是你的实体类里主键的类型

JpaSpecificationExecutor

这个接口可以帮助我们完成一些复杂查询,泛型T是你定义的实体类的类型

2.使用方法

只需要编写一个自己的接口继承上述两个接口并填好泛型即可调用

//测试类,调用接口的findAll方法
@Test
public void testFindAll(){
  List users = userDao.findAll();
  for (User user : users) {
    System.out.println(user);
  }
}

3.注意事项

JpaRepository接口里有findOne()和getOne()方法,从字面意思上来看,两种方法都是查询一个,的确如此,但它们两个本质上却有一定的差别

findOne()

底层调用了find()方法,当我们调用这个方法的时候直接为我们查出结果

getOne()

底层调用了getReference()方法,是一种懒加载的模式,使用动态代理的方式为我们创建一个动态代理对象,当我们调用查询结果时才会发送sql语句,查询出我们需要的结果

二、jpql查询

1.基本介绍

jpql即 Jpa Query Language

jpql语法和sql其实大同小异,jpql是针对实体类进行的操作,sql是直接对数据库表的操作,所以jpql里只是将sql里数据库表名、列名等信息替换为实体类属性而已

例如

sql语句的查询:select * from tbl_user where user_name = ?

jpql语句的查询:from User where userName = ?

2.使用方法

自定义的方法,这里使用@Query注解,value是jpql语句,你可能注意到了,每个问号后面都带了一个数字,这个数字其实就表示这个属性对应方法内形参的位置,这样我们就可以不按照属性的顺序进行赋值了。

/**
 * 根据用户id和name查询
 * @return 用户对象
 */
@Query(value = "from User where userId = ?2 and userName = ?1")
User findUserByIdAndName(String name, int id);

测试代码

@Test
public void testJpql1(){
  User user = userDao.findUserByIdAndName("张三", 1);
  System.out.println(user);
}

3.注意事项

想要使用jpql的前提是你已经使用注解配置好了实体类以及参数


注解的详细信息如下:

/**
 * @Entity
 *  作用:指定当前类是实体类。
 * @Table
 *  作用:指定实体类和表之间的对应关系。
 *  属性:
 *  name:指定数据库表的名称
 * @Id
 *  作用:指定当前字段是主键。
 * @GeneratedValue
 *  作用:指定主键的生成方式。。
 *  属性:
 *  strategy :指定主键生成策略。
 *   GenerationType.IDENTITY:自增,底层数据库必须支持自增(mysql)
 *   GenerationType.SEQUENCE:序列,底层数据库必须支持序列(oracle)
 *   GenerationType.TABLE:jpa提供的一种策略,通过生成一张表的方式完成主键自增,这张表存储了下一次添加的主键的值
 *   GenerationType.AUTO:由程序自动选择一种策略
 *
 * @Column
 *  作用:指定实体类属性和数据库表之间的对应关系
 *  属性:
 *   name:指定数据库表的列名称。
 *   unique:是否唯一
 *   nullable:是否可以为空
 *   inserttable:是否可以插入
 *   updateable:是否可以更新
 *   columnDefinition: 定义建表时创建此列的DDL
 *   secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字搭建开发环境[重点]
 */

三、sql查询

1.基本介绍

使用sql语句查询

2.使用方法

自定义的方法,与jpql不同的是,这种方法需要加上nativeQuery=true来声明这是一个本地查询(sql查询)

/**
 * 使用sql进行条件查询
 */
@Query(value = "select * from tbl_user where user_name like ?",nativeQuery = true)
List sqlFindByName(String name);

测试方法

@Test
public void testSql2(){
  List users = userDao.sqlFindByName("%张%");
  for (User user : users) {
    System.out.println(user);
  }
}

四、方法命名规则查询

1.基本介绍

顾名思义,这种方法就是使用Spring Data JPA规定的方法名称进行查询,这种方式不需要我们写jpql或者sql,Spring Data JPA会解析方法名帮我们自动创建查询

2.使用方法

自定义方法

/**
 * 根据用户名模糊查询和id匹配查询
 * @param name
 * @param id
 * @return
 */
List findUserByUserNameLikeAndUserId(String name, int id);

测试

@Test
public void TestName1(){
  List users = userDao.findUserByUserNameLikeAndUserAddress("%张%", "北京");
  for (User user : users) {
    System.out.println(user);
  }
}

3.命名规则

按照Spring Data JPA 定义的规则,查询方法以findBy开头,删除方法以deleteBy...... 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。

如果你使用的编译器是idea,当你编写的时候idea也会给出提示。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文详细解析了MySQL中常见的几种错误,并提供了具体的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文详细介绍了PostgreSQL与MySQL在SQL语法上的主要区别,包括如何使用COALESCE替代IFNULL、金额格式化的方法、别名处理以及日期处理等关键点。 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 本文详细介绍了如何利用Xshell配合Xftp实现文件传输,以及如何使用Pure-FTPd构建FTP服务,并探讨了VSFTP与MySQL结合存储虚拟用户的方法。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
author-avatar
愤怒的黑皮_165
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有