0
0
SpringbootHow-ToBeginner · 4 min read

How to Implement Search in Spring Boot: Simple Guide

To implement search in Spring Boot, use Spring Data JPA repositories with custom query methods or @Query annotations. Define search methods in your repository interface that accept search parameters and return filtered results from the database.
📐

Syntax

In Spring Boot, search is typically done by defining methods in a JpaRepository interface. You can use method names that describe the search criteria or write custom JPQL queries with @Query.

  • Method name query: Spring Data parses method names to create queries automatically.
  • @Query annotation: Write custom JPQL or SQL queries for complex searches.
java
public interface ProductRepository extends JpaRepository<Product, Long> {
    List<Product> findByNameContainingIgnoreCase(String name);

    @Query("SELECT p FROM Product p WHERE LOWER(p.description) LIKE LOWER(CONCAT('%', :keyword, '%'))")
    List<Product> searchByDescription(@Param("keyword") String keyword);
}
💻

Example

This example shows a Spring Boot application with a Product entity and a repository that supports searching products by name or description. The controller exposes a REST endpoint to perform the search.

java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.List;

@SpringBootApplication
public class SearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(SearchApplication.class, args);
    }
}

@Entity
class Product {
    @Id
    private Long id;
    private String name;
    private String description;

    // Constructors, getters, setters omitted for brevity
}

interface ProductRepository extends JpaRepository<Product, Long> {
    List<Product> findByNameContainingIgnoreCase(String name);

    @Query("SELECT p FROM Product p WHERE LOWER(p.description) LIKE LOWER(CONCAT('%', :keyword, '%'))")
    List<Product> searchByDescription(@Param("keyword") String keyword);
}

@RestController
class ProductController {
    private final ProductRepository repository;

    public ProductController(ProductRepository repository) {
        this.repository = repository;
    }

    @GetMapping("/search")
    public List<Product> search(@RequestParam(required = false) String name,
                                @RequestParam(required = false) String description) {
        if (name != null && !name.isEmpty()) {
            return repository.findByNameContainingIgnoreCase(name);
        } else if (description != null && !description.isEmpty()) {
            return repository.searchByDescription(description);
        } else {
            return repository.findAll();
        }
    }
}
Output
GET /search?name=phone returns list of products with 'phone' in name (case-insensitive) GET /search?description=wireless returns products with 'wireless' in description
⚠️

Common Pitfalls

  • Not using Containing or Like in method names causes exact match only, missing partial matches.
  • Ignoring case sensitivity can cause missed results; use IgnoreCase or LOWER() in queries.
  • For complex searches, relying only on method names can be limiting; use @Query for flexibility.
  • Not handling empty or null search parameters can cause errors or return unwanted results.
java
/* Wrong: exact match only, no partial search */
List<Product> findByName(String name);

/* Right: partial, case-insensitive search */
List<Product> findByNameContainingIgnoreCase(String name);
📊

Quick Reference

FeatureUsage ExampleDescription
Method Name QueryfindByNameContainingIgnoreCase(String name)Search by name with partial and case-insensitive match
@Query Annotation@Query("SELECT p FROM Product p WHERE LOWER(p.description) LIKE LOWER(CONCAT('%', :keyword, '%'))")Custom JPQL query for flexible search
Handling Null/Emptyif (param != null && !param.isEmpty())Check parameters before searching to avoid errors
Repository Interfaceinterface ProductRepository extends JpaRepositoryBase interface to enable CRUD and search methods

Key Takeaways

Use Spring Data JPA repository methods with descriptive names for simple search.
Use @Query annotation for complex or custom search queries.
Include case-insensitive and partial matching for better search results.
Always validate search parameters to avoid errors or unexpected results.
Expose search functionality via REST endpoints for easy client access.