【持久层框架】- SpringData - JPA( 三 )


文章插图
使用JPQL的方式查询(注解式SQL)通过Query注解可以实现更多灵活的条件查询等SQL·操作 。@Query 注解的使用非常简单,只需在方法上面标注该注解,同时提供一个JPQL查询语句即可,并且 , 在这些SQL语句中都是使用实体来进行操作,并非数据库的表结构来操作 。
计数通过Query可以写自己的SQL语句
@Query("select count(u) from User u") // 这里使用的是实体,并不是数据库的表名和字段Integer countUser();测试
@Testvoid CountUser() {Integer integer = userRepository.countUser();System.out.println(integer);}结果

【持久层框架】- SpringData - JPA

文章插图
参数传递在通过注解写SQL的时候,也需要是携带参数的 , 而Query通过?占位符来获得传来的参数数据,通过参数的位置定位哪个参数 。
//修改数据 一定加上@Modifying 注解@Transactional@Modifying@Query("update User set username=?1 where id=?2")int updateUsernameByIds(String username,Long id);结果
【持久层框架】- SpringData - JPA

文章插图
也可以使用原生的SQL,只需要加上 nativeQuery = true 即可 。
实体关系对应jpa中实体包括一对一,一对多,多对多,多对一关系,并且提供了相应的注解 。接下来通过案例来实现关系 。
一对一首先创建部门表,使用户指向一个部门 。
package com.jpa.demo.domain;import lombok.Data;import javax.persistence.*;import java.io.Serializable;/** * @author: lyd * @description: 部门 * @Date: 2022/10/2 */@Entity@Data@Table(name="sys_dept")public class Dept implements Serializable {@Id@Column(name = "dept_id")@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;}在User实体中加字段,通过OneToOne注解完成 。
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) //设置关联操作为ALL@JoinColumn(name = "dept_id")private Dept dept;这里的关联级别也是有多个,一般设置为all就行
  • ALL:所有操作都进行关联操作
  • PERSIST:插入操作时才进行关联操作
  • REMOVE:删除操作时才进行关联操作
  • MERGE:修改操作时才进行关联操作这样就可以编写测试
@Testvoid OneToOneTest() {User user = new User();user.setNickName("爱国德德");user.setUsername("lyd_code_studio");user.setPassword("lyd_open");Dept dept = new Dept();dept.setName("研发部");user.setDept(dept);User save = userRepository.save(user);System.out.println(save);}通过测试可得数据库结果,
【持久层框架】- SpringData - JPA

文章插图
【持久层框架】- SpringData - JPA

文章插图
通过关联 , 会在两个表中进行插入,删除也是会删除两个表中数据 。
一对多@OneToMany:作用:建立一对多的关系映射属性:targetEntityClass:指定多的多方的类的字节码mappedBy:指定从表实体类中引用主表对象的名称 。cascade:指定要使用的级联操作fetch:指定是否采用延迟加载orphanRemoval:是否使用孤儿删除创建一个文章表来实现一对多关系,一个用户可以发表多个文章,一个文章只属于一个用户 , 因此在用户表中是一对多,在文章表就是多对一 。通过@ManyToOne注解完成关系
package com.jpa.demo.domain;import lombok.Data;import javax.persistence.*;/** * @author: lyd * @description: 文章表 * @Date: 2022/10/2 */@Data@Entity@Table(name="yun_article")public class Article {@Id@Column(name = "article_id")@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false, length = 50) // 映射为字段 , 值不能为空private String title;@Basic(fetch = FetchType.LAZY) // 懒加载@Column(nullable = false) // 映射为字段 , 值不能为空private String content;@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)//可选属性optional=false,表示user不能为空 。删除文章,不影响用户@JoinColumn(name="user_id")//设置在article表中的关联字段(外键)private User user;}在user实体这边就是一对多关系 , 并且通过注解完成 。
@OneToMany(mappedBy = "user",cascade=CascadeType.ALL,fetch=FetchType.LAZY)//级联保存、更新、删除、刷新;延迟加载 。当删除用户,会级联删除该用户的所有文章//拥有mappedBy注解的实体类为关系被维护端private Set<Article> articles;测试,需要创建ArticleRepository
@Testvoid OneToMany() {User user = userRepository.getById(1L);Article article1=new Article();article1.setTitle("如何写好博客");article1.setContent("如何写好博客");article1.setUser(user);articleRepository.save(article1);Article article2=new Article();article2.setTitle("如何更进一步学习");article2.setContent("不断地卷");article2.setUser(user);articleRepository.save(article2);}

推荐阅读