Spring Data - 使用withoud if-else查询选项

时间:2017-11-08 13:59:37

标签: java rest spring-data-jpa jpql spring-rest

我正在尝试使用两个可选的参数来公开用于数据查询的简单REST-API:

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

不幸的是,我坚持使用正确的spring-data配置来启用正确的查询。下面的方法应该

  • 获取myServ /问候语 - 返回每个问候语
  • 获取myServ / greeting?message = X - 使用message = X
  • 返回每个问候语
  • 获取myServ / greeting?type = Y - 返回类型= Y
  • 的每个问候语
  • 获取myServ / greeting?message = X& type = Y - 使用message = X AND 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??;
    }
}

1 个答案:

答案 0 :(得分:0)

如果实体是那么简单的使用Query By Example。您的存储库需要扩展addtionaly QueryByExampleExecutor<Greeting>。这会将方法findAll(Example<S> example)添加到您的存储库。 然后你称之为:

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

其他选项是Criteria API和QueryDSL。提到所有三个选项here