SpringBoot2.X集成JPA踩坑

JpaRepository中的findOne()方法

findOne()使用示例

许多教程在SpringBoot集成JPA的时候,都会用到JpaRepository中的findOne()方法,如下所示:

	@Override
	public User findById(Integer id){
		return userRepository.findOne(id);
	}

User类:

	public class User {
    private Integer userId;

    private String userName;

    private String password;

    private String phone;

    //get/set函数以及构造函数省略

UserRepository类:

	import com.jialin.websitedemo.model.User;
	import org.springframework.data.jpa.repository.JpaRepository;

	public interface UserRepository extends JpaRepository<User,Integer>{
	}

问题:

可以发现
我们先去看一下源码:

	public interface QueryByExampleExecutor<T> {
    <S extends T> Optional<S> findOne(Example<S> var1);

    <S extends T> Iterable<S> findAll(Example<S> var1);

    <S extends T> Iterable<S> findAll(Example<S> var1, Sort var2);

    <S extends T> Page<S> findAll(Example<S> var1, Pageable var2);

    <S extends T> long count(Example<S> var1);

    <S extends T> boolean exists(Example<S> var1);
}

可以看到findOne需要传入Example对象,而不是Integer或者String

而在SpringBoot1.5的环境下:

	   T findOne(ID id);

因此我们也了解了为什么用findOne会报Inferred type ‘S’ for type parameter ‘S’ is not within its bound; should extend 'com.jialin.websitedemo.model.User 的错误了

解决方法:

  1. 用findById(id).get()替代findOne(id)
  2. 用getOne(id)替代findOne(id)

扩展

自定义JPA查询方法命名规则

摘自以千的博客
有一篇博客对于命名规则解释的较为全面,包括上图也是出自该博客:jpa方法名命名规则.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值