【问题标题】:How to search data in Spring JPA Restful Service如何在 Spring JPA Restful Service 中搜索数据
【发布时间】:2020-03-20 10:42:35
【问题描述】:

我想做一个弹簧数据搜索。下面是可用产品名称的列表。

"payload": [
    {
        "id": 1,
        "productName": "SHRIMPS COCKTAIL"
    },
    {
        "id": 2,
        "productName": "MELON FRAPE"
    },
    {
        "id": 3,
        "productName": "HORS D’OEUVRE VARIE"
    },
    {
        "id": 4,
        "productName": "CREAM OF VEGETABLES SOUP"
    },
    {
        "id": 5,
        "productName": "RAVIOLI AU JUS"
    },
    {
        "id": 6,
        "productName": "OMELETTE ESPAGNOLE"
    },
    {
        "id": 7,
        "productName": "CHICKEN A LA KING"
    },
    {
        "id": 8,
        "productName": "ROAST BEEF PRINTAINIERE"
    },
    {
        "id": 9,
        "productName": "PASRSLEY POTATOES"
    },
    {
        "id": 10,
        "productName": "SAUTED POTATOES"
    }
]

}

当我用这样的代码使用 Postman 搜索时,结果是成功的

{
"session":{
    "userId":"WebAdmin ACS",
    "timestamp":"2019-07-10 13:00:00"
}, 
"payload":{
    "pageNumber":0,
    "limit":5,
    "productName":"MELON FRAPE"
}

像这样响应 200 OK

{
"status": {
    "statusCode": "000",
    "statusDesc": "Success"
},
"pageData": {
    "totalData": 1,
    "totalPaging": 1
},
"payload": [
    {
        "id": 2,
        "productName": "MELON FRAPE"
    }
]

但是当我用关键字melon搜索时,结果却没有

{
"session":{
    "userId":"WebAdmin ACS",
    "timestamp":"2019-07-10 13:00:00"
}, 
"payload":{
    "pageNumber":0,
    "limit":5,
    "productName":"MELON"
}

}

回应:

{
"status": {
    "statusCode": "001",
    "statusDesc": "Data Not Found"
}

我想要的是,当输入诸如 m、me、melon 之类的关键字时,将得到相同的结果,而不必包含全名。我的代码是这样的

@RequestMapping(value = "/findproducthk", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public Response<List<Product>> findProductHouseKeeping(@RequestBody Request<FindProductHouseKeeping> request, HttpServletRequest httpServletRequest) throws JsonProcessingException, NoSuchAlgorithmException {
    Response<List<Product>> rvalue = new Response<>();

    Status status = new Status();
    String user = request.getSession().getUserId();
    log.info("Headers : " + HttpUtil.getHeadersInfo(httpServletRequest).toString());
    log.info("Incoming request from " + httpServletRequest.getRemoteAddr() + ":" + httpServletRequest.getRemotePort() + "\n"
            + "    Method    : " + httpServletRequest.getMethod() + "\n"
            + "    TLS       : " + httpServletRequest.isSecure() + "\n"
            + "    Path      : " + httpServletRequest.getRequestURI() + "\n"
            + "    Body      : " + mapper.writeValueAsString(request));

    FindProductHouseKeeping findProduct = request.getPayload();
    Pageable paging = PageRequest.of(findProduct.getPageNumber(), findProduct.getLimit(), Sort.by("productName").ascending());
    Page<Product> data = null;
     if (request.getPayload().getProductName() == null) {
        data = productRepository.findById(findProduct.getId(), paging);
    } else {
        data = productRepository.findByProductNameIgnoreCase(findProduct.getProductName().toLowerCase(), paging);
    }   
    if (data.isEmpty()) {
        status.setStatusCode("001");
        status.setStatusDesc("Data Not Found");
    } else {
        status.setStatusCode("000");
        status.setStatusDesc("Success");

        PagingResponse xPage = new PagingResponse();
        xPage.setTotalData(data.getTotalElements());
        xPage.setTotalPaging(data.getTotalPages());

        rvalue.setPayload(data.getContent());
        rvalue.setPageData(xPage);
    }

    log.info("Resp : " + status.toString());
    rvalue.setStatus(status);
    return rvalue;
}

================================================ ============================================== 公共类 FindProductHouseKeeping {

private int id;
private String productName;
private int pageNumber;
private int limit;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getProductName() {
    return productName;
}

public void setProductName(String productName) {
    this.productName = productName;
}

public int getPageNumber() {
    return pageNumber;
}

public void setPageNumber(int pageNumber) {
    this.pageNumber = pageNumber;
}

public int getLimit() {
    return limit;
}

public void setLimit(int limit) {
    this.limit = limit;
}

这里是仓库

public interface ProductRepository extends JpaRepository<Product, Integer> {
Page<Product> findByProductNameIgnoreCase(String productName, Pageable paging);
Page<Product> findById(Integer id, Pageable paging);

【问题讨论】:

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


【解决方案1】:

如果我理解正确,您正在搜索“MELON”,这只是数据库“MELON FRAPE”中数据的一部分

为了解决这个问题,您必须实现包含LikeContaining 的查询。选项很少:

  1. 在方法名称中使用支持的 JPA 关键字:

Page&lt;Product&gt; findByProductNameContainingIgnoreCase(String productName, Pageable paging);

  1. 创建方法(您可以随意调用它)并使用 @Query 注释,其中可以包含本机或 JPA 查询。

更多信息:docs

【讨论】:

  • 请接受此答案以结束问题。
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2021-03-03
  • 2019-06-08
相关资源
最近更新 更多