编写Repository根据一定的规则来编写方法命名 。jpa会自动识别方法名称进行操作 。
package com.jpa.demo.repository;import com.jpa.demo.domain.User;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.stereotype.Repository;import java.util.List;/** * @author: lyd * @description: UserRepository * @Date: 2022/10/2 */@Repositorypublic interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {//根据nickname查询List<User> findAllByNickName(String str);}
通过测试可以看到如下结果:

文章插图
在编写repository的时候会有一些规则提示,也就是只有符合这些规则才能够被识别 。这里只是展现了findxxx,实际上还有许多 。

文章插图
具体的关键字,使用方法和生产成SQL如下表所示

文章插图
使用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);}
结果
文章插图
参数传递在通过注解写SQL的时候,也需要是携带参数的,而Query通过?占位符来获得传来的参数数据,通过参数的位置定位哪个参数 。
//修改数据 一定加上@Modifying 注解@Transactional@Modifying@Query("update User set username=?1 where id=?2")int updateUsernameByIds(String username,Long id);
结果
文章插图
也可以使用原生的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);}
通过测试可得数据库结果,经验总结扩展阅读
- 如何正确饲养小松鼠
- 炖汤飞水啥意思
- 如何跟女生如何聊天
- 书旗小说今天推荐的小说有哪些
- 三星C7000怎么打开USB
- 形容多而密的词语
- 电脑屏幕144hz是什么意思
- 什么是猪下青
- 形容腊梅花的优美句子
- 进入终面意味着什么