Spring Data JPA使用JPQL与原生SQL进行查询
1、使用JPQL语句进行查询
JPQL语言(Java Persistence Query Language)是一种和SQL非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的SQL语言,从而屏蔽不同数据库的差异。
JPQL语言通过Query接口封装执行,Query 接口封装了执行数据库查询的相关方法。调用 EntityManager 的 Query、NamedQuery 及 NativeQuery 方法可以获得查询对象,进而可调用Query接口的相关方法来执行查询操作。
JPQL是面向对象进行查询的语言,可以通过自定义的JPQL完成UPDATE和DELETE操作。JPQL不支持使用INSERT。对于UPDATE或DELETE操作,必须使用注解 @Modifying 进行修饰。
【示例】使用JPQL语言进行查询。
package com.pjb.jpauserdemo.dao;import com.pjb.jpauserdemo.entity.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;import java.util.List;/*** 用户信息数据库访问接口* 使用JPQL语言* @author pan_junbiao**/
@Repository
public interface UserJpqlDao extends JpaRepository<UserInfo,Integer>
{/*** 根据用户姓名,查询用户信息*/@Query("SELECT u FROM UserInfo u WHERE u.userName = ?1")public UserInfo getUserInfoByName(String name);/*** 根据用户姓名,模糊查询用户列表*/@Query("SELECT u FROM UserInfo u WHERE u.userName like %:name%")public List<UserInfo> getUserListByName(String name);/*** 修改用户姓名*/@Modifying@Query("UPDATE UserInfo u SET u.userName = :name WHERE u.userId = :id")public int updateUserName(@Param("id")int userId, @Param("name")String userName);
}
2、使用原生SQL语句进行查询
在使用原生SQL查询时,也使用@Query注解。此时,nativeQuery参数需要设置为true。
【示例】使用原生SQL语句进行查询。
package com.pjb.jpauserdemo.dao;import com.pjb.jpauserdemo.entity.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;import java.util.List;/*** 用户信息数据库访问接口测试类* 使用原生SQL语言* @author pan_junbiao**/
@Repository
public interface UserSqlDao extends JpaRepository<UserInfo,Integer>
{/*** 根据用户ID,获取用户信息*/@Query(value = "SELECT * FROM tb_user WHERE user_id = :id",nativeQuery = true)public UserInfo getUserById(@Param("id")int userId);/*** 根据用户姓名,模糊查询用户列表*/@Query(value = "SELECT * FROM tb_user WHERE user_name LIKE %:userName%",nativeQuery = true)public List<UserInfo> getUserListByName(@Param("userName")String userName);/*** 修改用户姓名*/@Modifying@Query(value = "UPDATE tb_user SET user_name = :name WHERE user_id = :id",nativeQuery = true)public int updateUserName(@Param("id")int userId, @Param("name")String userName);
}
可以看到,@Query与@Modifying这两个注解一起声明,可以定义个性化更新操作。
Spring Data JPA使用JPQL与原生SQL进行查询相关推荐
- Spring Data JPA使用必备(二):Spring Data JPA方法命名规则实现SQL自动生成
Spring data JPA是一个好东西,但是对于很多习惯于写SQL,直接怼数据库的人来说,这个真的用不习惯,还被一致认为是一个不易于程序员发展的技术.因为JPA提供了标准的封装,在操作数据库的时候 ...
- Spring Data JPA Specification(规范)实现复杂查询
目录 持久化 API 接口概述 JpaSpecificationExecutor 常用 API JPA Specification 编码示例 持久化 API 接口概述 1.JPA 持久化 API 接口 ...
- Spring Data JPA 从入门到精通~方法的查询策略的属性表达式
方法的查询策略的属性表达式(Property Expressions) 属性表达式只能引用托管(泛化)实体的直接属性,如前一个示例所示.在查询创建时,已经确保解析的属性是托管实体的属性,但是,还可以通 ...
- spring data jpa框架学习之十 注解式查询方法详解(转载网上电子书,我注解)
@Query注解接口的定义 @Query注解的作用就是指定其下面定义的方法及传参是针对@Query后面指定的SQL语句所对应使用的(方法与SQL对照匹配的传参,使得对应的SQL得以执行) ----- ...
- Spring Data JPA 从入门到精通~方法的查询策略设置
方法的查询策略设置 通过下面的命令来配置方法的查询策略: @EnableJpaRepositories(queryLookupStrategy= QueryLookupStrategy.Key.CRE ...
- Spring Data JPA 从入门到精通~@Modifying修改查询
学习思路一样,我们先看源码: public @interface Modifying { //如果配置了一级缓存,这个时候用clearAutomatically=true,就会刷新hibernate的 ...
- Spring Data JPA 写SQL语句也可以如此简单
在使用 Spring Data JPA 的时候,通常我们只需要继承 JpaRepository 就能获得大部分常用的增删改查的方法.有时候我们需要自定义一些查询方法,可以写自定义 HQL 语句 像这样 ...
- ORM框架之Spring Data JPA(二)spring data jpa方式的基础增删改查
上一篇主要在介绍hibernate实现jpa规范,如何实现数据增删改查,这一篇将会着重spring data jpa 一.Spring Data JPA 1.1 Spring Data JPA介绍: ...
- Spring Data JPA问题汇总
刚进公司,发现都用的Spring Data JPA,一脸懵,知乎上遇到了一个大佬写的文章,非常详细,分享一下,我把大佬的文章整理了一下格式,比较好看了,原文链接:https://zhuanlan.zh ...
最新文章
- linux history 看更多历史记录_Linux历史记录history常用技巧
- Knative 化繁为简之道:应用部署与访问
- 第八十四节,css布局小技巧及font-awesome图标使用
- java内存泄露 垃圾回收_Java面试中底层垃圾回收、代码安全、内存泄露
- linux下内存调试工具——valgrind
- IBM Systems Director VMControl资源生命周期管理,第2部分
- CAN FD的波特率到底能跑多快?
- 多源信息融合技术研究综述
- 参考文献标引方式_论文参考文献标注格式
- 计算机视觉轮廓检测,轮廓检测
- java-获取上个月的第一天和最后一天
- 线段树合并学习笔记(P4556)
- 五线谱音名和组别对照表_五线谱最全知识及符号!
- Python爬虫:无账号无限制获取企查查信息
- mysql免安装版,遇到msvcr120dll文件丢失错误的解决方案
- MATLAB 写入数据为科学计数法形式/ e03/ 形式
- 树莓派实验室python人脸识别_使用树莓派进行简易人脸识别
- 2022新旅游消费趋势报告出炉,8K慢直播或成后疫情时代下文旅发展的一大卖点
- git基础配置/SSH
- 使用python生成随机中奖姓名和电话号码并存入excel