我有一个控制器尝试使用可选字段进行搜索。 JPA实体类定义为:
package demo;
import javax.persistence.*;
@Entity
public class UploadFile {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
public UploadFile() {
}
public UploadFile(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "UploadFile{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
以下代码定义了控制器:
@RequestMapping(value = "/searchFile", method = RequestMethod.GET)
public @ResponseBody
List<UploadFile> searchFile(@RequestParam("id") Optional<Integer> id, @RequestParam("name") Optional<String> name) {
UploadFile newFile = new UploadFile();
if (id.isPresent()) {
newFile.setId(id.get());
}
if (name.isPresent()) {
newFile.setName(name.get());
}
System.out.println("new File: " + newFile);
//uploadFileRepository is a JpaRepository Class
return List<UploadFile> files = uploadFileRepository.findAll(Example.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的记录。
我做错了什么吗?
谢谢!
答案 0 :(得分:0)
我认为是因为这个原因
if (name.isPresent()) {
newFile.setSize(name.get());
}
您正在做newFile.**setSize**(name.get());
,但是(我认为)应该是newFile.set**Name**(name.get());
答案 1 :(得分:0)
我认为您不能使用example
通过ID查找记录。 (这很合乎逻辑,如果您知道ID,那么为什么根本需要此功能?)
因此,如果请求中提供了id参数,则直接使用findById(id)
,否则填充示例对象的所有提供的属性,并使用findAll(Example.of(example))
方法。 / p>