spring data jpa 利用@Query进行查询

2023-11-13

介绍@Query注释之前,先看看怎么利用@NamedQuery进行命名查询

1.现在实体类上定义方法已经具体查询语句

@Entity
@NamedQuery(name = "Task.findByTaskName",
  query = "select t from Task t where t.taskName = ?1")
public class Task{

}

2.然后我们继承接口之后,就可以直接用这个方法了,它会执行我们定义好的查询语句并返回结果

public interface TaskDao extends JpaRepository<Task, Long> {
  Task findByTaskName(String taskName);
}

试想一下,如果我们想自己定义执行查询,利用命名查询,显然不行,因为,会在实体类上写很多的@NamedQuery,这种情况的话,我们可以用@Query直接在方法上定义查询语句,例如这样

public interface TaskDao extends JpaRepository<Task, Long> {
  @Query("select t from Task t where t.taskName = ?1")
  Task findByTaskName(String taskName);
}

@Query上面的1代表的是方法参数里面的顺序,除了写hql,我们还可以写sql语句

public interface TaskDao extends JpaRepository<Task, Long> {
  @Query("select * from tb_task t where t.task_name = ?1", nativeQuery = true)
  Task findByTaskName(String taskName);
}

在参数绑定上,我们还可以这样子用

public interface TaskDao extends JpaRepository<Task, Long> {
   @Query("select t from Task t where t.taskName = :taskName and t.createTime = :createTime")
  Task findByTaskName(@Param("taskName")String taskName,@Param("createTime") Date createTime);
}

当然在参数绑定上,我们还可以直写问号

public interface TaskDao extends JpaRepository<Task, Long> {
   @Query("select t from Task t where t.taskName = ? and t.createTime = ?")
  Task findByTaskName(String taskName, Date createTime);
}

再利用SpEL表达式,我们把实体类写成动态的

public interface TaskDao extends JpaRepository<Task, Long> {
   @Query("select t from #{#entityName} t where t.taskName = ? and t.createTime = ?")
  Task findByTaskName(String taskName, Date createTime);
}

这个的作用就是,当俩个实体类都有共同的父类的时候,例如这样

// JPA 基类的标识
@MappedSuperclass
@SuppressWarnings("serial")
public abstract class IdEntity implements Serializable{
    protected Long id;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
}

@Entity
public class Task extends IdEntity{

}

@Entity
public class Project extends IdEntity{

}

然后有一个通用的接口

public interface GenericDao<T> extends JpaRepository<T, ID> { 
  @Query("select t from #{#entityName} t where t.id= ?1")
   public T findById(Long id);   
}

再然后就taskDao和projectDao来继承这个接口,这样子的话,把公用的方法放在通用接口上,就不用重复写方法了。

好,下面再说下,利用@Modifying进行更新

@Modifying
@Query("update Task t set t.taskName = ?1 where t.id = ?2")
int updateTask(String taskName, Long id);

在这里我们说下,spring data jpa的查询策略,spring data jpa可以利用创建方法进行查询,也可以利用@Query注释进行查询,那么如果在命名规范的方法上使用了@Query,那spring data jpa是执行我们定义的语句进行查询,还是按照规范的方法进行查询呢?看下查询策略

查询策略的配置可以在配置query-lookup-strategy,例如这样

    <jpa:repositories base-package="com.liuxg.**.dao"
        repository-impl-postfix="Impl" 
        query-lookup-strategy = "create-if-not-found"
        entity-manager-factory-ref="entityManagerFactory"
        transaction-manager-ref="transactionManager" >
    </jpa:repositories>

他有三种值可以配置

  1. create-if-not-found(默认):如果通过 @Query指定查询语句,则执行该语句,如果没有,则看看有没有@NameQuery指定的查询语句,如果还没有,则通过解析方法名进行查询

  2. create:通过解析方法名字来创建查询。即使有 @Query,@NameQuery都会忽略

  3. use-declared-query:通过执行@Query定义的语句来执行查询,如果没有,则看看有没有通过执行@NameQuery来执行查询,还没有则抛出异常

@Query就先看到这里,下次再了解下怎么拓展spring data jpa 接口,例如我既想用sping data jpa的接口,可是我又想自己定义一些接口,我们把他们合二为一呢??

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring data jpa 利用@Query进行查询 的相关文章

  • ContentResolver.query详解

    1 查询手机的联系人 public void getContacts ContentResolver contentResolver 61 this getContentResolver Cursor cursor 61 contentRe
  • linux下调用mysql_query产生SIGSEGV段错误

    xfeff xfeff 程序需要用到MySQL来进行持久化 xff0c 代码在windows测试通过 xff0c 但在Linux调试时 xff0c 产生下面的异常 xff1a Thread 9 34 NodesManagerd 34 rec
  • mysql:In aggregated query without GROUP BY, expression #1 of SELECT list contains...........

    文章目录 问题描述问题溯源解决方式一解决方法二附录 xff1a 问题描述 下面是报错截图 xff1a span class token number 1140 span In aggregated query without GROUP B
  • Elasticsearch使用update_by_query

    elasticsearch中有一个方法是批量修改 xff0c 就是先查询出需要修改的索引记录 xff0c 然后批量修改 这个本来没什么 xff0c 但是使用过的都知道 xff0c 用java来调用这个方法很别扭 一般来说 xff0c 我们使
  • http请求参数之Query String Parameters、Form Data、Request Payload

    在与server端进行数据传递时 xff0c 通常会用到GET POST方法进行参数提交 xff0c 而参数提交的方式 xff0c 通常取决于server端对数据的接收方式 本文对几种常见的参数提交方式进行归纳及简述 xff0c 这不是一篇
  • Scheduling and emailing PeopleSoft Query results

    You could E Mail the Query results by embedding the paramters in a nVision Layout Create a Tabular nVision Layout Add th
  • JPA和hibernate以及SpringDataJPA

    什么是jpa JPA java persistence api 为POJO 就是我们的JavaBean 提供持久化标准规范 JavaEE规范之一 主要思想 3个 1 ORM Object Relational Mapping 映射元数据 通
  • How To get the usbdisk's drive letter properly

    Introduction We know USB disk should be a removable disk just like floppy disk and be used more and more widely now Beca
  • elk笔记13--Query DSL

    elk笔记13 Query DSL 1 基础介绍 2 常见查询类型 2 1 Query and filter context 2 2 Compound queries 2 3 Full text queries 2 4 Geo querie
  • Spring整合Hibernate实现Spring Data JPA

    在上一篇文章 Spring整合Hibernate实现JPA持久化 中 我们已经介绍了怎样在Spring容器中合理地集成Hibernate来实现JPA的ORM机制 但是 细心的读者会发现 上一篇文章中使用了EntityManager来直接与数
  • ES查询效率-Query、Filter&term

    目的 Google上博客众说纷纭大同小异 逻辑正确但略为混乱 再此梳理出容易混淆的点 1 是否算分只与查询方式有关 与是否term查询 match查询无关 Query查询 查询上下文 查询操作不仅仅会进行查询 还会计算分值 用于确定相关度
  • elk笔记13--Queries-term-level queries

    elk笔记13 Queries term level queries 1 term level 查询简介 2 term level 查询类型 2 1 exists query 2 2 fuzzy query 2 3 ids query 2
  • 实战DeviceIoControl 之五:列举已安装的存储设备

    Q 前几次我们讨论的都是设备名比较清楚的情况 有了设备名 路径 就可以直接调用CreateFile打开设备 进行它所支持的I O操作了 如果事先并不能确切知道设备名 如何去访问设备呢 A 访问设备必须用设备句柄 而得到设备句柄必须知道设备路
  • 获取本地硬盘信息

    using System using System Runtime InteropServices using System Text namespace driverId Serializable public struct HardDi
  • vue-router路由中对query中的参数进行加密

    vue router路由中对query中的参数进行加密 源码地址在文末 在创建路由的时候 添加两个方法 stringifyQuery 序列化传入的query参数 方法可以接收一个对象参数 在new Router的时候传递这个属性 在序列化q
  • Spring Boot 整合各种常用技术的代码都在这了

    文章目录 前言 技术清单 简要说明 代码地址 交流 前言 一份慕课网价值 58 元的专栏课程 Spring Boot 趣味私房课 源码 内容为 Spring Boot 与当今主流技术的整合 有很多使用的范例 技术清单 Swagger JUn
  • Capturing iteration variables

    首先要理解Lambda表达式的延迟执行 Deferred execution An important feature of most query operators is that they execute not when constr
  • 有discuz数据库,忘了管理员密码,怎样进后台

    很简单 你注册一个用户 密码设个简单一点的 然后在ucenter的数据库中uc members表中找到这个用户的password字段和salt字段 把你在uc members表中的管理员账号的password和salt字段修改成新注册用的的
  • 磁盘设备类型获取函数

    将该部分内容保存到 cpp文件中可直接编译运行 用于辨别驱动器的类型 define MEDIA INFO SIZE sizeof GET MEDIA TYPES 15 sizeof DEVICE MEDIA INFO define IOCT
  • Java自动生成bean、dao、service、impl、controller(JPA初版)

    关自动生成代码我是这么想的 初步 目录 一 拿到所有表名 列名 列类型数据 C3P0连接数据库并获取所需数据 所需数据对象 测试拿到的数据 结果 二 用FreeMarker模板生成对应JPA架构Java文件 编写模板 bean ftl be

随机推荐