M Alok
M Alok

Reputation: 1081

Retrieving array of json objects stored in couchbase document | spring

How do I retrieve an array of JSON objects stored in a couchbase document and store it in its respective list, say List<ProjectSummary> using spring-data?

Below is the content of the document named 'project-summary' on couchbase -

[
    {
        "id": "1",
        "title": "New API",
        "owner_id": "dsdssdsd445d",
        "description": "Yh A Testin API",
        "status": "unactiveAPI"
    },
    {
        "id": "2",
        "title": "New TW Projec API",
        "owner_id": "dsdssdsd445d",
        "description": "Testin API",
        "status": "unactiveAPI"
    },
    {
        "id": "3",
        "title": "Projec API",
        "owner_id": "dsdssdsd445d",
        "description": "Testin",
        "status": "unactiveAPI"
    }
]

When I try to retrieve it using as follows-

public interface ProjectSummaryRepository extends CrudRepository<List<ProjectSummary>, String>{}

//within main method
Optional<List<ProjectSummary>> summaries = projectSummaryRepo.findById(COUCHBASE_DOCUMENT_ID);

i get an exception saying -

java.lang.ClassCastException: org.springframework.data.couchbase.core.mapping.CouchbaseList cannot be cast to org.springframework.data.couchbase.core.mapping.CouchbaseDocument

I have annotated my document class as below -

@Document
public class ProjectSummary implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    private String id;
    @Field
    private String title;
    @Field
    private String owner_id;
    @Field
    private String status;
    @Field
    private String description;

    //getters and setters
}

Upvotes: 0

Views: 794

Answers (1)

deniswsrosa
deniswsrosa

Reputation: 2460

Using findById can't be used in this scenario. You have to use SpringData DSL to query your data:

public interface ProjectSummaryRepository extends CrudRepository<List<ProjectSummary>, String> {

   //using standard Spring Data DSL
   List<ProjectSummary> findByTitleAndStatus(String title, String status)

   //complex query using N1QL syntax
   @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and status = $1 and ( title  = $2 or owner_id = $3)")
   List<ProjectSummary> findWithSomeComplexQuery(String status, String title, String owner_id)
 }

After that you can simply call those methods inside your code;

  List<ProjectSummary> sumaries = projectSummaryRepo.findByTitleAndStatus("someTitle", "someStatus")

  List<ProjectSummary> sumaries2 = projectSummaryRepo.findWithSomeComplexQuery("someStatus", "someTitle", "owner123" )

Upvotes: 2

Related Questions