原文地址:https://www.miaoroom.com/code/note/springdatajpa-findone-bug.html
出处:喵容
首先我说一下我遇到问题的由来,视频中用的是SpringDataJPA
的1.11版本,可以使用findOne()
方法根据id查询,然后我使用了2.0.5版本,发现findOne()
方法报错了,不能用来当作根据id查询了。
下面是报错的代码:
package com.miaoroom.sell.repository;
import com.miaoroom.sell.dataobject.ProductCategory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.*;
/**
* @Description: TODO
* @create: 2019/1/19 14:51
* @author: znnnnn
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProductCategoryRepositoryTest {
@Autowired
private ProductCategoryRepository repository;
@Test
public void findOneTest() {
//ProductCategory productCategory = repository.findOne(1);//这一行报错
ProductCategory productCategory = repository.findById(1).get();
System.out.println(productCategory.toString());
}
}
2.0.5的已经变成了findById(id).get()来查询了。这是两个不同的版本,源码已经发生变化。后来去找源码中的findOne方法发现,findOne方法已经变了。想了解跟多的朋友可以去https://projects.spring.io/spring-boot/了解。
1.xx版本的CrudRepository类是这样的:
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S var1);
<S extends T> Iterable<S> save(Iterable<S> var1);
T findOne(ID var1);
boolean exists(ID var1);
Iterable<T> findAll();
Iterable<T> findAll(Iterable<ID> var1);
long count();
void delete(ID var1);
void delete(T var1);
void delete(Iterable<? extends T> var1);
void deleteAll();
}
2.x.x版本的CrudRepository类是这样的:
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S var1);
<S extends T> Iterable<S> saveAll(Iterable<S> var1);
Optional<T> findById(ID var1);
boolean existsById(ID var1);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> var1);
long count();
void deleteById(ID var1);
void delete(T var1);
void deleteAll(Iterable<? extends T> var1);
void deleteAll();
}
发现了吗?findOne
方法不在CrudRepository
中了
而现在的findOne去了哪里呢?
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);
}
这个问题最近碰到好多次了,啊哈哈
那来这写写笔记啊[wb_doge]现在流量涨得挺快