Java 带有可选字段的JPA存储库findAll

Java 带有可选字段的JPA存储库findAll,java,spring,spring-data-jpa,Java,Spring,Spring Data Jpa,我有一个控制器尝试用可选字段搜索。 JPA实体类定义为: 软件包演示; 导入javax.persistence.*; @实体 公共类上载文件{ @身份证 @GeneratedValue(策略=GenerationType.AUTO) 私有int-id; 私有字符串名称; 公共上传文件(){ } 公共上载文件(字符串名称){ this.name=名称; } 公共字符串getName(){ 返回名称; } 公共void集合名(字符串名){ this.name=名称; } 公共int getId(){

我有一个控制器尝试用可选字段搜索。 JPA实体类定义为:

软件包演示;
导入javax.persistence.*;
@实体
公共类上载文件{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
私有字符串名称;
公共上传文件(){
}
公共上载文件(字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
@凌驾
公共字符串toString(){
返回“上传文件{”+
“id=”+id+
“,name=”“+name+”\“””+
'}';
}
}
控制器在以下代码中定义:

@RequestMapping(value=“/searchFile”,method=RequestMethod.GET)
公共@ResponseBody
列表搜索文件(@RequestParam(“id”)可选id,@RequestParam(“name”)可选名称){
UploadFile newFile=新上传文件();
if(id.isPresent()){
setId(id.get());
}
if(name.isPresent()){
newFile.setName(name.get());
}
System.out.println(“新文件:“+newFile”);
//uploadFileRepository是一个JpaRepository类
return List files=uploadFileRepository.findAll(示例.of(newFile));
}
数据库有一条记录:

ID      NAME    SIZE    TYPE  
1       index   111     html
当“/searchFile?id=1”点击服务器时,控制台将打印:

new File: UploadFile{id=1, name='null'}
http返回一个空数组:

我希望
/searchFile?id=1
返回id为1的记录, 还可以
/searchFile?name=index
返回id为1的记录

我做错什么了吗


谢谢

我想,正因为如此

if (name.isPresent()) {
        newFile.setSize(name.get()); 
}

您正在执行
newFile.*setSize**(name.get())但它应该(我相信)是
newFile.set**Name**(Name.get())

我认为您不能使用
示例
按id查找记录。(这是非常合乎逻辑的,如果您知道id,那么为什么需要此功能?)


因此,如果请求中提供了id参数,那么直接使用
findById(id)
,否则填充示例对象提供的所有属性,并使用
findAll(example.of(example))
方法。

name参数为null,因此不重要。我添加了实体类,并更正了代码,它仍然找不到记录。能否为“/searchFile?id=1”添加生成的查询?您的代码看起来不错,问题一定在其他地方。将
UploadFile
类包含到您的问题中。@sh977218,您能添加生成的查询吗?谢谢!事情就是这样。我删除了ID,它工作了。