7

SpringBoot: Couchbase and the _class attribute

 3 years ago
source link: https://blog.knoldus.com/springboot-couchbase-and-the-_class-attribute/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SpringBoot: Couchbase and the _class attribute

Reading Time: 2 minutes

While learning new technology, we often face some barriers. Though this solvable or non-solvable barrier always ends up in making you learn some new things about the technology. A few days back while using Couchbase as my back-end DB in a Spring-boot Application , I encountered one problem.
So, this blog will brief you with the problem and solution.

Problem:

I have created a reactive Spring-boot application using reactive couchbase API. I have a use case of searching employee by its name. So, I have created a derivable query method.

Mono<Employee> findByEmpName(String name);

But sometimes, it was returning employee details or sometimes an empty response. Though the document was available in the bucket.

Observation:

Basically, we come up with the observation that whenever we try to add any document in our bucket, a field _class always get added as a part of JSON in a document. So, my bucket is having two types of document one with _class attribute and another without the _class attribute.
And based on the method findByEmpName mentioned above, the auto-generated query would look like :

WHERE (empName= name and _class = "edu.knoldus.employee.model.Employee")

It’s just like if your document consists _class, then it will deserialize the document, otherwise, you will get an empty response.

So, what we can do is, we can overwrite this auto-generated query. Now the question is how? 🤔

Solution:

We can use the @Query annotation and overwrite our auto-generated query. Let’s see how.

  @Query("#{#n1ql.selectEntity} where empName = $1")
    Mono<Employee> findByEmpName(String name);

Here,  #{#n1ql.selectEntity} is syntactic sugar for select * from bucket which fetches all the employee details by empName from couchbase.
And make sure not to add #{#n1ql.filter} in your query as it filters the document by _class field.
Hope you understand the above use case. Please feel free to comment below if you have any doubt or suggestions.

References:

Couchbase with Spring-Boot and Spring Data

blog_footer


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK