JPQL自定义查询语句

JPQL自定义查询语句

一、JPQL自定义查询语句
  1.含义
    1、JAVA持久性查询语句(JPQL)是一种面向对象的查询语言,
       将SQL语法和简单查询予以绑定进行操作
    2、SQL面向的是表和字段访问操作数据
    3、JPQL完全面向对象,通过类名和属性访问操作数据库,而不是表名和表的属性
    4、JPQL所提供的查询语法主要分为三类
      1)select查询语句
      2)update修改语句
      3)delete删除语句
      4)不能做新增 原生继承的save方法已经满足
  2.使用规则
    1、方法名
      1)根据规范起名 (getData)
    2、查询语句  使用@Query注解进行自定义注解
    3、修改和删除语法
      1)使用@Query注解进行自定义操作
      2)使用@Modifying注解通知SpringData这是一个DELETE或UPDATE操作
      3)使用@Transactional进行事务管理
      三个注解缺一不可
    4、参数使用规则
      1)占位符?X  需要和方法中所传递的参数顺序一致。X是从1开始
      2)@Param("参数名")
        1>方法中所传递的参数使用@Param("sname")注解标识命名参数
        2>JPQL:sname使用参数
        3>如果是普通值 八种基本、包装类、String
      3)参数是对象
        1>使用@Param标注
        2>JPQL中使用:#{#对象.属性名}
二、原生SQL查询
  1.使用规则
    0、纯原声SQL操作
    1、在@Query中开启原生SQL操作  nativeQuery = true
    2、增删改操作需要使用
      1)@Modifying
      2)@Transactional
  5.错误
    1、java.sql.SQLExeption:Can not issue data manipulation statements with
       executQueery()
    2、少些了@Modifying
原生SQL实现增删改查,针对的是表和字段操作的
查询
1、根据书籍名称模糊查询
2、根据类型名称查询书籍信息
三、事务操作

事务管理@Transactional有业务层房业务层 没有业务层放持久层
如果是对单一方法进行管理 放在方法上
如果类中多个方法进行擦走 放在类统一管理
四、动态SQL
1.问题
2.解决方案
  1、继承JpaSpecificationExecutor接口调用内置方法
  2、内置方法
    1)T findOne(Specification<T>spec);单个查询
    2)List<T>findAll(Specification<T>spec);多条件查询功能
    3)Page<T>findAll(Specification<T>spec,Pageable Pageable);多条件查询+分页
  3、特殊对象
    1)Specification对象  它是查询条件对象,是一个接口,可以在实现Specification接口时,自定义动态SQL
    2)Pageable对象
      1>分页专用工具
      2>在SpringBoot
3.多条件动态SQL查询以上版本,由PageResultof(page,size)生成
4.分页实现
关键字抽象方法
问题
  1、默认方法不够用
  2、关键字抽象方法名字太长
     省事但是不能满足实际需求
     多条件查询都不能实现

动态SQL:多条件
1、需要一个对象专门存放查询的条件
2、if判断来拼接sql
3、值比较  banme = #{}

使用@Query 自定义查询

@Query主要是这个注解

@Query("select s from Student s where s.studentName = ?1")
Student findByStudentName(String studentName);
  • 该方法的名字可以自定义,Student 是实体类,studentName 是实体类中的属性,?1:表示参数
    占位符及序号。

在StudentController 中进行调用

@RequestMapping("/findStudentsByName")
public Object findStudentBystudentName(String name) {
Student student = repository.findByStudentName(name);
return student;
}

@Query 与@Modifying 的联合使用

  • 如果要修改学生姓名
@Transactional
@Modifying
@Query("update Student s set s.studentName=?1 where s.studentId=?2")
int setFixedStudentNameFor(String studentName,int studentId);
  • 要执行更新操作,将JPQL 语句放到@query 注解中,还要结合@Modifying 注解才可以识别执行
    更新操作,还需要使用@Transcational 进行事务处理,三个注解缺一不可。

在StudentController 里面进行调用

//修改
	@RequestMapping("/User/save")
	public Object getsave(User user) {
		return dao.userSave("赵云", 1);
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值