晚上好,我遇到了 Spring 的问题。 findOne
返回以下错误:
org.springframework.data.repository.query.querybyexampleexecutor可以 不适用于给定的类型;
必填:示例
发现很长
下面的一些代码,看看我是否可以提供帮助。 :)谢谢
@RestController
@RequestMapping("/produtos")
public class ProdutoResource {
@Autowired
private ProdutoServico produtoServico;
public ProdutoResource(ProdutoServico produtoServico){
this.produtoServico = produtoServico;
}
@GetMapping
@ResponseBody
public List<Produto> findAll(){
return this.produtoServico.findAll();
}
@RequestMapping(value = "{/id}")
@ResponseBody
public Produto find(@PathVariable(value = "id") Long id){
return this.produtoServico.find(id);
}
public interface ProdutoServico {
public List<Produto> findAll();
public Produto find(Long id);
public Produto create(Produto produto);
public Produto update();
public void delete();
}
@Service
public class ProdutoServiceImpl implements ProdutoServico {
@Autowired
private ProdutoRepository produtoRepository;
public ProdutoServiceImpl(ProdutoRepository produtoRepository){
this.produtoRepository = produtoRepository;
}
@Override
public List<Produto> findAll() {
return this.produtoRepository.findAll();
}
@Override
public Produto find(Long id) {
return this.produtoRepository.findOne(id);
// return null;
}
已编辑
@Entity
public class Produto {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Long id;
@Column
private String nome;
@Column
private Integer qtd;
@Column
private Date dataCriacao;
getters an setters omitted
@Override
public String toString() {
return "{" + "id=" + this.id + ", nome=" + this.nome + ", qtd=" + this.qtd + ", dataCriacao=" + this.dataCriacao + '}';
}
}
。
@Repository
public interface ProdutoRepository extends JpaRepository<Produto, Long>{
}
答案 0 :(得分:1)
方法ProdutoRepository.findOne(Example<S> var1)
采用Produto
并返回匹配结果。
Produto p = new Produto();
p.setName("something");
Example<Produto> match = Example.of(p);
Optional<Produto> result = produtoRepository.findOne(match);
但是看一下你的代码,你试图得到Produto
给定的主键值(Produto Id)。然后你应该使用:
Optional<Produto> result = produtoRepository.findById(id);
答案 1 :(得分:1)
尝试更改
value="{/id}"
到
value="/{id}"
在控制器的@RequestMapping内部,还要检查表中主键值的数据类型是否与模型类中id的数据类型相同。希望这有助于解决您的问题。
答案 2 :(得分:1)
作为Spring Data Kay(2.0)的一部分,方法findOne(ID id)
已重命名为findById(ID id)
。因此,剩下的唯一剩余findOne
方法是以Example
为参数的方法。
答案 3 :(得分:0)
谢谢你,如下:
@Override
public Produto find(Long id) {
Optional<Produto> produto = produtoRepository.findById(id);
Produto prod = new Produto();
prod.setId(produto.get().getId());
prod.setNome(produto.get().getNome());
prod.setDataCriacao(produto.get().getDataCriacao());
prod.setQtd(produto.get().getQtd());
return prod;
}
邮递员
{ &#34; id&#34;:2,
&#34; nome&#34;:&#34; Produto2&#34;,
&#34; qtd&#34;:50,
&#34; dataCriacao&#34;:null }
注意:dataCriacao实际上是null。
答案 4 :(得分:-1)
您需要为请求映射指定方法类型
添加方法= RequestMethod.GET,如下所示
@RequestMapping(method = RequestMethod.GET,value = "{/id}")
@ResponseBody
public Produto find(@PathVariable(value = "id") Long id){
return this.produtoServico.find(id);
}
这应解决API层问题。有关更多信息,请添加模型和存储库类
<强>更新强>
以下使用 - 最有效的CRUD(CrudRepository)
@Repository
public interface ProdutoRepository extends CrudRepository<Produto, Long>{
}