'Spring — Passing List<String> of values in Payload POST API to Springframework.data.jpa.repository.Query "IN"

Lets assume we have one table/View with below columns

columns : ID , Status

I am writing one search API to get Data from backend

I am using org.springframework.data.jpa.repository.JpaRepository

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
.....

@Repository
@Transactional
public interface UIDashboard extends JpaRepository<UIDashboardView, String> {

....

@Query(value = "SELECT results from SearchView results where "
            + "(:status  is null or results.STATUS  = :status) and"
            + "(coalesce(:ids) is null or results.ID in :ids)" 
...

My DTO

import java.util.List;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import java.util.Optional;

import lombok.Data;
@Data
@JsonInclude(Include.NON_NULL)
public class SearchInputDTO {

   @JsonProperty(value="status",required = false)
    private String status;
    @JsonProperty(value="ids",required = false)
    //private Optional<List<String>> ids; 
    //ArrayList<String> ids; 
    private List<String> ids;     

REST API

import org.springframework.web.bind.annotation.PostMapping;
...

@PostMapping("/searchTest")
public ResponseEntity<List<ResultsDTO>> search_test(
  @RequestBody @NotNull @Valid SearchInputDTO payload, HttpServletRequest request)
    throws IOException {

    }

{
    "status" : "COMPLETED",
    "ids" : [null,null]
}

Issue with the approach is to invoke POST REST API i need to send two null values [null,null] in payload i,e without id's property i am unable to execute POST API , so either i need to send null values or set in DTO.

I also tried to make Optional in DTO or

Used coalesce -> (coalesce(:ids) is null or results.ID in :ids)

i dont want to explicitly send null values in Payload , User can search with any parameter for example only with one property :status:

{
    "status" : "INPROCESS"
    
}

Above payload not working as i am not sending "ids"

Then i tried set nulls in setter as workaround

     @JsonProperty(value="ids",required = false)
   private List<String> ids = new ArrayList<>(Arrays.asList(null, null));



   @JsonSetter("ids")
    public void setIds(List<String> li){
        if (li != null) {
            if (li.size() < 2){
                li.add(null);
                li.add(null);
                this.ids = li;
              }
            else{
                this.ids = li;
            }
        }
    }

I dont like this work around , is there any better solution or changes required to JPQL IN parameter or SearchInputDTO .

I also followed blog Spring Data repository with empty IN clause

Thanks,

Showkath.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source