spring data jpa 利用@Query进行查询

简介: 介绍@Query注释之前,先看看怎么利用@NamedQuery进行命名查询1.现在实体类上定义方法已经具体查询语句@Entity@NamedQuery(name = "Task.

介绍@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来执行查询,还没有则抛出异常

相关文章
|
1月前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
36 9
|
1月前
|
SQL Java 关系型数据库
Springboot引入jpa来管理数据库
Springboot引入jpa来管理数据库
36 0
Springboot引入jpa来管理数据库
|
1月前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
42 0
|
2月前
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
【Java笔记+踩坑】Spring Data JPA
|
3月前
|
Java Spring 数据库
怎样动动手指就能实现数据操作?Spring Data JPA背后的魔法揭秘
【8月更文挑战第31天】在Java开发中,数据库交互至关重要。传统的JDBC操作繁琐且难维护,而Spring Data JPA作为集成JPA的数据访问层解决方案,提供了CRUD等通用操作接口,显著减少代码量。通过继承`JpaRepository`,开发者能轻松实现数据的增删改查,甚至复杂查询和分页也不再困难。本文将通过示例详细介绍如何利用Spring Data JPA简化数据访问层的开发,提升代码质量和可维护性。
43 0
|
3月前
|
存储 Java 数据库
|
3月前
|
存储 Java API
|
缓存 Java Go
解决Spring Data JPA查询存在缓存问题及解决方案
解决Spring Data JPA查询存在缓存问题及解决方案
666 0
|
6月前
|
XML Java 数据库连接
Spring Boot的数据访问之Spring Data JPA以及Hibernate的实战(超详细 附源码)
Spring Boot的数据访问之Spring Data JPA以及Hibernate的实战(超详细 附源码)
113 0
|
3月前
|
Java 数据库连接 数据库
Spring Data JPA 与 Hibernate 之区别
【8月更文挑战第21天】
85 0
下一篇
无影云桌面