FindOne不能使用Spring

时间:2018-04-23 23:24:56

标签: java spring spring-boot netbeans spring-data

晚上好,我遇到了 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;
    }

enter image description here

enter image description here

已编辑

@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>{

}

5 个答案:

答案 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>{

    }