spring jpa基础:使用repository接口

spring jpa:
一、使用repository连接数据库,都是在dao的接口类中使用,用法统hibernate大同小异
1.直接继承JpaRepository接口,调用对应的save方法
2.dao层中实现import org.springframework.data.repository.Repository;方法(方法名须规范)
举例:
在这里插入图片描述

然后在controller中直接调用
对于多属性
举例:
在这里插入图片描述

对于like,加条件属性时加上%%
举例:
在这里插入图片描述

3.使用注解,继承同2那个情况,支持hql语句
举例:

@Query("from Users where name = ?1")//需要在后面加下标,低版本不需要
	List<Users> queryByNameUserHQL(String name);

未加下标报错点,解决:在HQL的?号后面加上下标,从1开始
在这里插入图片描述

sql语句,举例:

@Query(value="select * from users where name = ?",nativeQuery = true)//navtive默认为false,即使用HQL,habernate需要转换为HQL语句
	List<Users> queryByNameUserSQL(String name);

-使用query注解实行更新会出现下列错误
NOT SUPPORT DML:不支持更多的更新
小知识点
dml:即增删改差操作
ddl:对数据库对象的操作,如表,表空间等
-使用hql实现修改:

@Query(value="update Users set name = ?1 where id =?2")//Users为对象对应的名字,而不是数据库表名
	@Modifying //表示值需要执行更新操作
	void updateNameById(String name,Integer id);

报错点:
对象定义成数据库错误,解决:名字改成对应的对象名

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: sers is not mapped

更新未放在事务当中,解决:添加@Transactional注解在测试类当中

Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

小知识点:

@Test
@Transactional//@Te st和@Transactional在一起是自动回滚的
@Rollback(false)//需要将回滚关闭

二、使用crudrepository接口
它是继承repository接口,即可使用父接口所有方法
在这里插入图片描述

更新与添加为一个方法,存在该对象进行修改,不存在执行刷新,评判标准为实体主键

三、使用PagingandSortingrepository接口,该接口实现了分页和排序处理,他继承自父对象CrudRepository
在这里插入图片描述

排序:
旧版本使用方法:
//定义排序规则

Order order=new Order(Direction.DESC, "id");
Sort sort=new Sort(order);
//sort对象封装了排序规则
List<Users> list=(List<Users>) this.userRepositoryPageDAO.findAll(sort);
for(Users user:list) {
    System.out.println(user.toString());
}

2.3.2新版本使用:
//定义排序规则

Order order=new Order(Direction.DESC, "id");
//sort对象封装了排序规则
List<Users> list=(List<Users>) this.userRepositoryPageDAO.findAll(Sort.by(order));//这里Sort直接调用,因为封装来静态方法 。属性可为String、list<orders>、order
for(Users user:list) {
    System.out.println(user.toString());
}

分页:
旧版本使用

Pageable pageable = new PageRequest(0,2);//下标从0开始,显示两条
Page<Users> page=this.userRepositoryPageDAO.findAll(pageable);
System.out.println("总套数:"+page.getTotalElements());
System.out.println("总页数:"+page.getTotalPages());
List<Users> list=page.getContent();
for(Users user:list) {
	System.out.println(user.toString());
}

2.3.2新版本使用

Pageable pageable = PageRequest.of(0,2);//下标从0开始,显示两条
//sort对象封装了排序规则
Page<Users> page=this.userRepositoryPageDAO.findAll(pageable);
System.out.println("总套数:"+page.getTotalElements());
System.out.println("总页数:"+page.getTotalPages());
List<Users> list=page.getContent();
for(Users user:list) {
	System.out.println(user.toString());
}

2.3.2排序加分页结合使用

@Test
public void testRepositoryPageAndSort() {
    Page<Users>  page=this.userRepositoryPageDAO.findAll(PageRequest.of(0,2,Sort.by(Direction.DESC, "id")));
	System.out.println("总套数:"+page.getTotalElements());
	System.out.println("总页数:"+page.getTotalPages());
	List<Users> list=page.getContent();
	for(Users user:list) {
		System.out.println(user.toString());
	}
}

四、JpaRepository接口
该接口继承了PagingAndSortingRepository接口
使用类型返回不需要强制类型转换

@Test
public void testJpaRepositorySort() {
	//直接使用jpareository的接口不需要强制类型转换
	Page<Users> page= this.usersRepositoryDAO.findAll(PageRequest.of(0,2,Direction.DESC, "id"));
	List<Users> list=page.getContent();
	for(Users user:list) {
		System.out.println(user.toString());
	}
}

五、JPASpecificationExecutor接口
该接口主要是实现了多条件查询的支持,并且可以在查询中添加分页和排序(单独存在)
在这里插入图片描述

使用单查询
//root:查询对象的属性封装
//CriteriaQuery:封装了我们要查询的各个部分的信息
//CriteriaBuilder :查询条件的构造器
1:

@Test
	public void testJpaSpecification1() {
		//单条件查询
		Specification<Users> spec=new Specification<Users>() {
			@Override
			public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
				// TODO Auto-generated method stub
				Predicate pre=criteriaBuilder.equal(root.get("name"),"张三");
				return pre;
			}
		};
		List<Users> list=this.usersRepositorySpecification.findAll(spec);
		for(Users user:list) {
			System.out.println(user.toString());
		}
	}

and多条件的叠加,2:

@Test
	public void testJpaSpecification2() {
		//但条件查询
		Specification<Users> spec=new Specification<Users>() {
			@Override
			public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
				// TODO Auto-generated method stub
				List<Predicate> list=new ArrayList<Predicate>();
				list.add(criteriaBuilder.equal(root.get("name"),"张三"));
				list.add(criteriaBuilder.equal(root.get("age"),20));
				Predicate[] arr=new Predicate[list.size()];
				return criteriaBuilder.and(list.toArray(arr));
			}
		};
		List<Users> list=this.usersRepositorySpecification.findAll(spec);
		for(Users user:list) {
			System.out.println(user.toString());
		}
	}

3:

@Test
	public void testJpaSpecification2() {
		//但条件查询
		Specification<Users> spec=new Specification<Users>() {
			@Override
			public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
				// TODO Auto-generated method stub
				return criteriaBuilder.and(criteriaBuilder.equal(root.get("name"),"张三"),criteriaBuilder.equal(root.get("age"),20));
 		}
		};
		List<Users> list=this.usersRepositorySpecification.findAll(spec);
		for(Users user:list) {
			System.out.println(user.toString());
		}
  
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 在使用JPA编写Repository接口方法时,可以按照以下几种方式进行编写。首先,可以直接继承JpaRepository接口,然后调用对应的save方法来实现数据的保存。其次,可以在dao层中实现Repository接口的方法,方法名需要符合规范。\[1\]JpaRepository继承了PagingAndSortingRepository接口,并添加了一组JPA规范相关的方法。在JpaRepository中,直接返回了List,省去了我们进行强制类型转换的步骤。在开发中,最常用的是JpaRepositoryJpaSpecificationExecutor接口。\[2\]如果需要了解更多关于JpaRepository使用方法,可以参考相关的文章,如《JpaRepository数据层 Spring Data JPA 提供的各种Repository接口》和《一步一步学SpringDataJpa——JpaRepository查询功能》。\[3\] #### 引用[.reference_title] - *1* [spring jpa基础使用repository接口](https://blog.csdn.net/Dumb_Brother/article/details/127449008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [JPARepository详解](https://blog.csdn.net/xfx_1994/article/details/104921234)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值