Spring Data - 使用带有 if-else 的可选查询



>我正在尝试公开简单的 REST-API 用于数据查询,并提供两个可选的参数:

GET myServ/greeting?message=X&type=Y

不幸的是,我卡住了正确的弹簧数据配置以实现正确的查询。以下方法应

  • 获取我的服务/问候语 - 返回每个问候语
  • 获取 myServ/greeting?message=X - 用 message=X 返回每个问候语
  • GET myServ/greeting?type=Y - 返回每个 type=Y 的问候语
  • GET myServ/greeting?message=X&type=Y - 返回每个带有message=X和type=Y

虽然简单 - 但我不想在我的控制器中编写任何 if-else 代码!是否启用了任何会导致以下行为的现成配置?我尝试了标准JpaReposotory方法和ExampleMatchers的不同组合,但仍然无法使其工作。

我的模型:

package my.model;
import lombok.*; 
import javax.persistence.*;
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@ToString
public class Greeting {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String message;
    private String type;
}

存储 库:

package my.repository;
import my.model.Greeting;
import org.springframework.data.jpa.repository.JpaRepository;
public interface GreetingRepository extends JpaRepository<Greeting, Long>{
}

网络控制器:

package my.web;
import my.model.Greeting;
import my.repository.GreetingRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
@RestController
public class GreetingController {
    @Autowired
    private GreetingRepository repository;
    @RequestMapping(value = "/greeting", method = GET)
    public List<Greeting> get(
            @RequestParam(value = "message", required = false) String message,
            @RequestParam(value = "type", required = false) String type ){
        return HOW_TO_DO_IT??;
    }
}

如果实体这么简单,请使用按示例查询。您的存储库需要扩展附加QueryByExampleExecutor<Greeting>。这会将方法findAll(Example<S> example)添加到存储库中。然后你这样称呼它:

Example<Greeting> example = Example.of(new Greeting("someMessage", "aType"));
repo.findAll(example);

其他选项包括标准 API 和 QueryDSL。这里提到了所有三个选项。

最新更新