<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alexis Pavlidis</title>
    <description>The latest articles on DEV Community by Alexis Pavlidis (@apavlidi).</description>
    <link>https://dev.to/apavlidi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F112099%2F96e5c44e-1933-4c94-9df4-f93b4ca1d9ce.jpeg</url>
      <title>DEV Community: Alexis Pavlidis</title>
      <link>https://dev.to/apavlidi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/apavlidi"/>
    <language>en</language>
    <item>
      <title>How I keep up with software</title>
      <dc:creator>Alexis Pavlidis</dc:creator>
      <pubDate>Sat, 13 Mar 2021 10:39:49 +0000</pubDate>
      <link>https://dev.to/apavlidi/how-i-keep-up-with-software-46on</link>
      <guid>https://dev.to/apavlidi/how-i-keep-up-with-software-46on</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;The software industry is really dynamic and it requires a lot of effort to keep up with the latest trends. Basically, there is no end to learning in the IT industry. One of the most important skills that a software engineer must have is the way of staying up to date with the latest updates. I'm often asked how I keep up with the trends in the field of software engineering, and how I learn new stuff. Undeniably an important part of learning is practice. I still remember Uncle Bob`s quote in the Clean Coders book&lt;/p&gt;

&lt;blockquote&gt;

&lt;center&gt;It is not your employer's responsibility to make sure you are marketable. It is not your employer's responsibility to train you, or send you to conferences, or buy your books. These things are your responsibility. You should plan on working 60 hours a week. The first 40 are for your employer. The remaining 20 are for you. During this remaining 20 hours you should be reading, practising, learning, and otherwise enhancing your career.&lt;/center&gt;
&lt;/blockquote&gt;

&lt;p&gt;Saying that I thought writing a blog post will give some guidelines to people that are finding it hard to follow up with software or want to discover other alternatives of learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Podcasts
&lt;/h2&gt;

&lt;p&gt;Podcasts are a great way to learn new stuff and keep up with trends. I`ve been listening to podcasts since I was an undergrad and it's been an important way of learning for me. I used to listen to podcasts during my commute but nowadays working remotely I will probably do it in parallel with another activity. I prefer podcasts that are less than an hour because it does not require a lot of time commitment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.hanselminutes.com/"&gt;Hanselminutes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.codurance.com/publications/tag/podcasts"&gt;Codurance Talks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.thoughtworks.com/podcasts"&gt;ThoughtWorks Technology&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://aws.amazon.com/podcasts/aws-podcast/?podcast-list.sort-by=item.additionalFields.EpisodeNum&amp;amp;podcast-list.sort-order=desc"&gt;AWS Podcast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://stackoverflow.blog/podcast/"&gt;The Stack Overflow Podcast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://6figuredev.com/category/podcast/"&gt;The 6 Figure Developer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://changelog.com/jsparty"&gt;JS Party: Javascript &amp;amp; Web Dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://simpleprogrammer.libsyn.com/"&gt;Simple Programmer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.infoq.com/the-infoq-podcast/podcasts/"&gt;InfoQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://ryanripley.com/agile-for-humans/"&gt;Agile for Humans&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Books
&lt;/h2&gt;

&lt;p&gt;Reading books seems kinda outdated. But books have been an important way of my learning process. If you want to explore a technical topic in-depth, then books are an excellent choice. Yes, the industry evolves incredibly fast, but certain books will help you explore your field of work on a much deeper level. The most influential thing throughout my career was reading Clean Code by Uncle Bob. I read that book while I was in the second year of my studies and it completely changed my mindset about software. Back then I did not know who Uncle Bob was, so after googling I learnt about Martin Fowler, Kent Beck, Grady Booch, Jim Coplien and all the well-known people in the software industry. This of course helped me create a backlog of books that I had to read since some of those books are "must-reads" for all software engineers regardless of their experience.&lt;/p&gt;

&lt;p&gt;Here is my notion page of Books that I've read or about to read soon:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iQ0C4DzJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2qs3efa8no1d2jmzx6lw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iQ0C4DzJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2qs3efa8no1d2jmzx6lw.png" alt="Alt Text" width="880" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Attend Events
&lt;/h2&gt;

&lt;p&gt;Conferences and meetings are an excellent way to follow new trends. Many new products and developments in the IT realm are presented at conferences and meetups. One of the most important benefits of such events is the ability to meet new people from the software industry and make valuable contacts. It's also a great way of discussing software, exchanging ideas with people that work in different domains/companies with different dynamics. Some of the events I would recommend attending are the following.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conferences
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://sc-london.com/"&gt;London Software Craftsmanship Conference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://voxxeddays.com/athens/"&gt;VoxxedDays Athens&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://voxxeddays.com/thessaloniki/"&gt;VoxxedDays Thessaloniki&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://devoxx.com/"&gt;Devoxx&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://gotopia.tech/"&gt;GOTO conference&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Meetups
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/Thessaloniki-Not-Only-Java/"&gt;Thessaloniki not-only Java Meetup Group&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/Thessaloniki-NET-Meetup/"&gt;Thessaloníki .NET Meetup&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/dddlondon/"&gt;Domain-Driven Design London&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/london-software-craftsmanship/"&gt;London Software Craftsmanship Community&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/Londonjavacommunity/"&gt;LJC - London Java Community&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.meetup.com/London-Microservices/"&gt;London Microservices&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I`ve met great people throughout my participation in those events and they helped me massively with my career progression. I feel really lucky that I had the chance to participate in such events which boosted my knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice
&lt;/h2&gt;

&lt;p&gt;Whenever I learn a new technology, tool, or programming language I will always use Stack Overflow to verify my knowledge and try to answer questions regarding the new topic. One of the best ways to learn something is using the Feynman Technique where you try to explain in a simple way solutions to other people's problems. Answering questions in Stack Overflow helps me a lot construct my thoughts and potentially find gaps in my explanation. A second benefit of using Stack Overflow when learning a new subject is that you can quickly get a good essence of the common issues and problems other devs are facing regarding that subject. Another good way of practising a new topic I am learning is by doing code katas.&lt;/p&gt;

&lt;blockquote&gt;

&lt;center&gt;A code kata is an exercise in programming which helps programmers hone their skills through practice and repetition.&lt;/center&gt;
&lt;/blockquote&gt;

&lt;p&gt;Code katas are an excellent way of practising a new tool, library, concept, programming language, or a new design technique. It's a practice session where the goal is not only to solve the problem but to practice and sharpen your skills during the process of solving it. You can find some of the katas I have solved in my GitHub account &lt;a href="https://github.com/apavlidi"&gt;here&lt;/a&gt;.&lt;br&gt;
There are two websites I use for finding katas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://katalyst.codurance.com/"&gt;Katalyst&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://codingdojo.org/kata/"&gt;CodingDojo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing to note here is that pairing is extremely useful when solving code katas or working on side project. I strongly recommend working on a team so you can share tips, resources and experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Online Courses
&lt;/h2&gt;

&lt;p&gt;Software is an industry where most of the information is publicly available through the internet. There are a huge number of tutorials that can help you learn new stuff. Tutorials are a great way of learning by doing, which for me is an effective technique of learning. Online education is really popular in our industry due to its low cost, and time-saving advantages. Besides, experience beats theory most of the time - so combining both is probably a more effective way of learning. These are the platforms I am using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.udemy.com/"&gt;Udemy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.pluralsight.com/"&gt;Pluralsight&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.oreilly.com/"&gt;Oreilly&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.linkedin.com/learning"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Youtube has a lot of good tutorials as well but compared to the above mentions the quality on average is much lower but there are exceptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Have a plan
&lt;/h2&gt;

&lt;p&gt;Keeping up with software is certainly a hard task. Things do change constantly at a fast pace. The amount of information we as software engineers consume every day is huge and keeping track of everything is really difficult. Having a plan or a list of topics you want to learn can be quite helpful. I`ve been using tools as my second brain to help me structure all this information. To be honest I had a hard time finding a good tool to fulfil that purpose. I used Trello, Asana, Miro, Google Keep, Evernote but nothing quite worked for me.&lt;/p&gt;

&lt;p&gt;Last 3 months I've been using Notion as my second brain tool and it's been an awesome experience. Notion has components for notes, kanban boards, wikis, databases, calendars etc. By connecting those components you can create systems for knowledge, data and project management. Here you can see my dashboard for the software section. I have subpages to each one of those pages but you probably get the idea. Everything new that I might need to read later, will go to the Reading List. If I have an idea of a project, or a blog post it will add that to Ideas and so forth.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--txESSQH3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3b6upeuacfvs2atoahu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--txESSQH3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3b6upeuacfvs2atoahu.png" alt="Alt Text" width="880" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another useful resource I used throughout the years is the &lt;a href="https://roadmap.sh/"&gt;roadmap.sh&lt;/a&gt;. It's been a great guide for me to pick up the next topic I want to learn especially when I was more junior and I was overwhelmed by all the different topics under the software umbrella.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other ways of following trends
&lt;/h2&gt;

&lt;p&gt;The following list is resources that I don't heavily rely on and it's more like optional ways for me for learning new stuff.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Surveys - Surveys are great for giving you insights into the trends in software. In my opinion &lt;a href="https://insights.stackoverflow.com/survey/"&gt;Stack Overflow Survey&lt;/a&gt; is by far the best one related to software.&lt;/li&gt;
&lt;li&gt;  Follow People that Talk about Tech&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/explore"&gt;GitHub Explore&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Newsletters: &lt;a href="https://news.ycombinator.com/"&gt;HackerNews&lt;/a&gt;, &lt;a href="https://www.tldrnewsletter.com/"&gt;TLDR&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Certifications: &lt;a href="https://aws.amazon.com/certification/"&gt;AWS Cloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Competitions: &lt;a href="https://codingcompetitions.withgoogle.com/hashcode/"&gt;HashCode&lt;/a&gt;, &lt;a href="https://ieeextreme.org/"&gt;IEEEXtreme&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The world of IT is changing regularly and hence you have to evolve as IT evolves. Staying ahead of the competition and on top of your game requires a formidable effort. A final suggestion would be to read, practice, repeat.&lt;/p&gt;

</description>
      <category>software</category>
      <category>career</category>
      <category>learning</category>
      <category>tips</category>
    </item>
    <item>
      <title>How to support filters to your restful APIs with Spring Data MongoDB</title>
      <dc:creator>Alexis Pavlidis</dc:creator>
      <pubDate>Wed, 20 Nov 2019 18:00:01 +0000</pubDate>
      <link>https://dev.to/apavlidi/how-to-support-filters-to-your-restful-apis-with-spring-data-mongodb-355a</link>
      <guid>https://dev.to/apavlidi/how-to-support-filters-to-your-restful-apis-with-spring-data-mongodb-355a</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Writing truly Restful APIs is not simple. There are a lot of features that need to be covered to call an API restful. One aspect of those features is providing parameters to filter and manipulate the data of a resource. Two months ago I was practicing my TDD skills, and I decided to build a simple blog engine using Spring Boot + Spring Data MongoDB (technologies that I never used before). So I got to a point that I needed to support filtering, selecting, sorting and pagination. I realized there was nothing "simple" that I could use, so I build a custom solution and published it on the &lt;a href="https://search.maven.org/artifact/com.github.apavlidi/restfulQueries/0.0.1/jar" rel="noopener noreferrer"&gt;Maven Central Repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concept
&lt;/h2&gt;

&lt;p&gt;We will build an endpoint that supports filtering, selecting, sorting and pagination using Spring Boot + Spring Data MongoDB. We will build it in a way that implementing it to other controllers would be straight forward.&lt;br&gt;
To support these filters we have to accept a parameter to our controller, so we have to define a &lt;b&gt;RequestParam&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;The paramater must be a type of Map which will represent our filters. The valid keys of the map should be sort, select, q, pageSize, page representing our different filters that can be applied to our resource.&lt;br&gt;
For example to limit the results of your query you have to add the parameter pageSize with value a a number greater than or equal to 0 to the URL.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GET /blogs?pageSize=5&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The pageSize parameter will be a key to our &lt;b&gt;RequestParam&lt;/b&gt; map variable with a value the number defined to the URL.&lt;/p&gt;

&lt;p&gt;There are two steps for implementing this.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collect the URL parameters and pass them to the repository.&lt;/li&gt;
&lt;li&gt;Translate the URL parameters in a way MongoDB understands.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;Let's begin by defining our Rest Controller.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;After having our filters as a parameter we have to validate their existence and collect them to pass them to our service and eventually to our repository. This function should be in a separate class from our Rest Controller to be reusable to other controllers as well.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The &lt;b&gt;collectRestApiParams&lt;/b&gt; function will accept the filters from a controller and check if there are valid keys defined as a parameter to the URL and if there are it will add them to a new map. It's responsible for collecting all parameters, so for each one, we have a separate function.&lt;br&gt;
The collect functions are pretty simple, they just check if there is a valid key in the filter's map and adds it to our new map called &lt;b&gt;restApiQueries&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;For example the &lt;b&gt;collectPageFilter&lt;/b&gt; checks if there is a key "page" and just adds it to &lt;b&gt;restApiQueries&lt;/b&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The &lt;b&gt;collectRestApiParams&lt;/b&gt; will be called from inside our Rest Controller and the returned value will be a map of valid keys to be passed to the service.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The service will delegate these filters to the repository and with that, we finished the first step: &lt;del&gt;Collect the URL parameters and pass them to the repository&lt;/del&gt; ✔️&lt;/p&gt;

&lt;p&gt;The next step is to translate these filters in a way that MongoDB understands. To do that we will use a &lt;b&gt;Query&lt;/b&gt; object and apply MongoDB filters upon it before the database call. Our repository function looks like this:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The last missing part is the functions that are applying these filters to the &lt;b&gt;query&lt;/b&gt; object. So let's define the functions that translate the parameters to MongoDB filters. The function &lt;b&gt;applyRestApiQueries&lt;/b&gt; is responsible for applying all parameters to filters of the &lt;b&gt;query&lt;/b&gt; object and should be to a separate class for reusability purposes.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;This &lt;b&gt;query&lt;/b&gt; object is received from the repository function before the database call.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now let's write the functions that apply each parameter separately to the &lt;b&gt;query&lt;/b&gt; object.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;The &lt;b&gt;applyPageQueryParam&lt;/b&gt; takes the value of the key "page" and applies the "skip" filter to our query object by calling &lt;code&gt;query.skip(skip)&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Because we are passing the query object by reference, any changes made to this object will be affected to the repository's query object as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;b&gt;applyPageSizeQueryParam&lt;/b&gt; takes the value of the key "pageSize" and applies the "limit" filter to our query object by calling &lt;code&gt;query.limit(limit)&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The &lt;b&gt;applySortQueryParam&lt;/b&gt; takes the value of the "sort" key which is a field name of a resource that represents the sorting field. If the field has a minus "-" symbol in front of it, it means the direction is descending otherwise it's ascending. After storing its value, we apply the "sort" filter to our query object by calling &lt;code&gt;query.with(new Sort(sortDir, sortBy))&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The &lt;b&gt;applySelectQueryParam&lt;/b&gt; takes the value of the "select" which is a string of field names of a resource separated by a comma. Then split the fields with the comma delimiter and we append each field by using &lt;code&gt;query.fields().include(selectedField)&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The &lt;b&gt;applySearchQueryParam&lt;/b&gt; is the trickiest one. The value of the "q" key in the map is a JSON object, so we have to parse the JSON and pass it to the query by calling &lt;code&gt;query.addCriteria(Criteria.where(field).is(value))&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The second step is done: &lt;del&gt;Translate the URL parameters in a way MongoDB understands&lt;/del&gt; ✔️&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing time
&lt;/h2&gt;

&lt;p&gt;Here is our testing resource:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Let's try to sort our blogs by title with descending order.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzb7gmg2secclmmih39ve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzb7gmg2secclmmih39ve.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can select specific fields from the blogs, such as id, title.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzqthb3ifv3o2hu4ngdc9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzqthb3ifv3o2hu4ngdc9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can also limit the results and retrieve the second page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F79uaalp2l3cema9o76tt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F79uaalp2l3cema9o76tt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note that the page starts from index 0.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now let's search for a blog with the text "This is content 1".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fsl1zc3ptdpfhdk3rgawe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fsl1zc3ptdpfhdk3rgawe.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The implementation is pretty simple, we just added two extra steps to our flow to support the filters, the collection of the parameters which will take place on our Rest Controller, and the filter applier which will take place before the database call. &lt;/p&gt;

&lt;p&gt;Here is a sequence diagram of our process&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg1k5l6ywf7vudy3r6v96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg1k5l6ywf7vudy3r6v96.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I said before I published this code to the Maven Central Repository so you can support filters to your application by just adding the &lt;a href="https://search.maven.org/artifact/com.github.apavlidi/restfulQueries/0.0.1/jar" rel="noopener noreferrer"&gt;dependency&lt;/a&gt;.&lt;br&gt;
Read the &lt;a href="https://github.com/apavlidi/RestfulQueries/wiki/API-Documentation" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; for more details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source code
&lt;/h2&gt;

&lt;p&gt;Available on &lt;a href="https://github.com/apavlidi/RestfulQueries.git" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
