具有可选字段的JPA存储库findAll

时间:2019-03-02 04:56:02

标签: spring-data-jpa

我有一个控制器尝试使用可选字段进行搜索。 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的记录。

我做错了什么吗?

谢谢!

2 个答案:

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