I have a controller try to search with optional field. The JPA entity class is defined as:
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 + '\'' +
'}';
}
}
The controller is defined in the following code:
@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));
}
the database has one record
ID NAME SIZE TYPE
1 index 111 html
when '/searchFile?id=1' hits server, the console print:
new File: UploadFile{id=1, name='null'}
the http return empty array.
I want the '/searchFile?id=1' return the record with id 1, and also '/searchFile?name=index' return the record with id 1 too.
Is there anything I did wrong?
Thanks!
I think, its because of this,
You are doing
newFile.**setSize**(name.get());
but it should(i believe) benewFile.set**Name**(name.get());
I think you cannot use the
example
to find records by id. (Which is quite logical, if you know the id then why do you need this feature at all?)So if the id parameter is provided in the request then use
findById(id)
directly, otherwise fill all the provided properties of an example object and use thefindAll(Example.of(example))
method.