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

问题描述 投票:0回答:1

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

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

Respone 200 OK like this

{
"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);
java spring rest api spring-data-jpa
1个回答
3
投票

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

为了解决此问题,您必须实现包含LikeContaining的Query。选项很少:

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

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

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

更多信息:docs

© www.soinside.com 2019 - 2024. All rights reserved.