参照https://blog.csdn.net/yingxiake/article/details/51016234#reply

https://blog.csdn.net/choushi300/article/details/71438693

https://blog.csdn.net/zhuzhu81/article/details/77745400

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);
}
  • 1
  • 2
  • 3
  • 4

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

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

  1. 【hql】spring data jpa中 @Query使用hql查询 问题

    spring data jpa中 @Query使用hql查询 问题 使用hql查询, 1.from后面跟的是实体类 不是数据表名 2.字段应该用实体类中的字段 而不是数据表中的属性 实体如下 hql使 ...

  2. Spring Data JPA中的动态查询 时间日期

    功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...

  3. spring data jpa使用原生sql查询

    spring data jpa使用原生sql查询 @Repository public interface AjDao extends JpaRepository<Aj,String> { ...

  4. Spring Data JPA 在 @Query 中使用投影的方法

    Spring Data JPA 在 @Query 中使用投影的方法 关于投影的基本使用可以参考这篇文章:https://www.baeldung.com/spring-data-jpa-project ...

  5. Spring data jpa 实现简单动态查询的通用Specification方法

    本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...

  6. Spring data jpa中Query和@Query分别返回map结果集

    引用: http://blog.csdn.net/yingxiake/article/details/51016234 http://blog.csdn.net/yingxiake/article/d ...

  7. Spring MVC和Spring Data JPA之按条件查询和分页(kkpaper分页组件)

    推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有, 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 ...

  8. Spring Data Jpa的四种查询方式

    一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaR ...

  9. Spring Data Jpa (四)注解式查询方法

    详细讲解声明式的查询方法 1 @Query详解 使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效.一般只需要关心@Query里面的value和nativeQuery的值.使用声明式JPQ ...

随机推荐

  1. rpc接口mock平台

    转载:http://blog.csdn.net/ronghuanye/article/details/71124320 1.简介 平台采用struts.spring.mybatis框架开发设计,主要用 ...

  2. Java基础学习过程

    转载:http://blog.csdn.net/scythe666/article/details/51699954JVM 1. 内存模型( 内存分为几部分? 堆溢出.栈溢出原因及实例?线上如何排查? ...

  3. java学习笔记——可用链表

    NO 链表方法名称 描述 1 public void add(数据类型 对象) 向链表中增加数据 2 public int size() 查看链表中数据个数 3 public boolean isEm ...

  4. chrome浏览器提取网页视频

    http://blog.csdn.net/pipisorry/article/details/37728839 在我们平时上网看视频听音乐时都会产生缓存,可是我们非常难通过一些软件把当中的视频和音乐文 ...

  5. sublime 插件(持续更新)

    sublime text 3创建新文件插件-AdvanceNewFile 这里要记录sublime text 3 在创建新文件时安装的插件–AdvanceNewFile ST本来自带的创建新文件的快捷 ...

  6. java.String中的方法

    (String) str.trim() 该方法返回一个复制该字符串的开头和结尾的白色空格去掉,或字符串,如果它没有头或尾空白. (Boolean) str.contains(str1) 判断 str ...

  7. vivado2013.4和modelsim联合仿真

    vivado2013.4和modelsim联合仿真                           Hello,Panda        最近在做Zynq的项目,曾经尝试使用ISE+PlanAhe ...

  8. CAN协议学习(二)MCAN控制器介绍

    更多细节请参看MCAN2文档mcan2_ps.pdf. 一.MCAN2简介 MCAN2是Mentor公司开发的一个CAN2.0网络控制器的软核,初版2001年末版2006年.MCAN 2控制器实现了B ...

  9. 《TomCat与Java Web开发技术详解》(第二版) 第八章节的学习总结 -- 访问mysql

    终于学到如何访问Mysql了 1. 可以看看此章节提供的sql脚本,以后可以照着写了.此外,对于Mysql如何使用,最好的地方就是其官网介绍了.http://dev.mysql.com/doc/ref ...

  10. 腾讯课堂十大Excel函数

    十大函数:if,sumifs,countifs,vlookup,match,index,indirect,subtotal,left(mid,right),offset substotal:用于灵活计 ...