繁体   English   中英

如何在Spring JPA Restful Service中搜索数据

[英]How to search data in Spring JPA Restful Service

我想进行弹簧数据搜索。以下是可用产品名称的列表。

"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"
    }
]

但是当我用关键字瓜搜索时,结果不存在

{
"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);

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

为了解决此问题,您必须实现Query,其中将包括LikeContaining 有几种选择:

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

Page<Product> findByProductNameContainingIgnoreCase(String productName, Pageable paging);

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

更多信息: docs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM