Spring中findOne方法无法使用问题求助
解决Spring Data中findOne方法传Long报错的问题
嘿,这个问题我之前踩过坑!其实是Spring Data JPA版本迭代带来的方法变化导致的——你现在调用的findOne属于QueryByExampleExecutor接口的方法,它要求传入Example类型参数做示例查询,但你传了Long类型的ID,参数类型不匹配自然就报错了。
问题根源
在Spring Data JPA 2.0及以上版本,原来CrudRepository里的findOne(ID id)方法被移除了,取而代之的是findById(ID id)(返回Optional<T>类型,用来更优雅处理空值)。而现在的findOne方法归属于示例查询体系,专门用来根据实体示例做匹配查询,所以参数必须是Example类型。
快速解决方案
最直接的做法就是把调用的方法换成findById,同时处理它返回的Optional对象:
假设你的仓库接口是这样的:
public interface ProdutoRepository extends JpaRepository<Produto, Long> { }
那服务层的代码可以改成这样:
// 服务层方法示例 public Produto buscarProdutoPorId(Long id) { // 方式1:找不到就抛出自定义异常(推荐,避免空指针) return produtoRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("Produto com id " + id + " não encontrado")); // 方式2:找不到返回null(兼容旧代码,但不推荐) // return produtoRepository.findById(id).orElse(null); }
如果非要用findOne(比如习惯旧写法),也可以用Example构造查询,但这种方式没必要,反而冗余:
public Produto buscarProdutoPorId(Long id) { Produto produtoExemplo = new Produto(); produtoExemplo.setId(id); Example<Produto> example = Example.of(produtoExemplo); return produtoRepository.findOne(example).orElse(null); }
小提醒
记得检查你的Spring Data JPA依赖版本:如果是2.x及以上,就用findById;如果是1.x版本,原来的findOne(ID id)还能正常使用,但建议升级到新版本,Optional能帮你更安全地处理空值场景。
内容的提问来源于stack exchange,提问作者sounobre
相关产品推荐
相关产品推荐

