Spring Search
Spring Search provides advanced search capabilities to a JPA entity
Explore the docs ยป
View Demo
ยท
Report Bug
ยท
Request Feature
Table of Contents
About The Project
Spring Search provides a simple query language to perform advanced searches for your JPA entities.
Let's say you manage cars, and you want to allow API consumers to search for:
- Cars that are blue and that were created after year 2006 or whose model name contains "Vanquish"
- Cars whose brand is "Aston Martin" or whose price is more than 10000$
You could either create custom repository methods for both these operations, which works well if you know in advance which fields users might want to perform searches on. You could also use spring-search that allows searching on all fields, combining logical operators and much more.
Please note that providing such a feature on your API does not come without risks such as performance issues and less clear capabilities for your API. This article summarizes these risks well.
Built With
Getting Started
Requirements : JDK 8 or more.
To get a local copy up and running follow these simple steps.
Installation
Maven
Add the repo to your project inside your pom.xml
file
<dependency>
<groupId>com.sipios</groupId>
<artifactId>spring-search</artifactId>
<version>0.2.0</version>
</dependency>
Gradle
Add the repo to your project by adding implementation 'com.sipios:spring-search:0.2.0'
in your build.gradle
file.
Usage
Your repository should be annotated as a RepositoryRestResource
and should extend JpaSpecificationExecutor
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.JpaSpecificationExecutor
import org.springframework.data.rest.core.annotation.RepositoryRestResource
@RepositoryRestResource
interface YourRepository : JpaRepository<YourModel, Int>, JpaSpecificationExecutor<YourModel>
Import the library in your controller
import com.sipios.springsearch.anotation.SearchSpec
Use it in your controller
@GetMapping("searchUrl")
fun yourFunctionNameHere(@SearchSpec specs: Specification<YourModel>): ResponseEntity<List<YourResponse>> {
return ResponseEntity(yourRepository.findAll(Specification.where(specs)), HttpStatus.OK)
}
-
Using the not equal operator
!
Request :/cars?search=color!Red
-
Using the greater than operator
>
Request :/cars?search=creationyear>2017
-
Using the less than operator
<
Request :/cars?search=price<100000
-
Using the starts with operator
*
For the ends with operator, simply place*
at the beginning of the word.
For the contains operator, simply place*
at the beginning and the end of the word.
Request :/cars?search=brand:Aston*
-
Using the
OR
operator
Request :/cars?search=color:Red OR color:Blue
-
Using the
AND
operator
Request :/cars?search=brand:Aston* AND price<300000
-
Using parenthesis
Request :/cars?search=( brand:Nissan OR brand:Chevrolet ) AND color:Blue
Note: Spaces inside the parenthesis are not necessary -
Using space in nouns
Request :/cars?search=model:'Spacetourer Business Lounge'
-
Using special characters
Request:/cars?search=model:ไธญๅV7
-
Using deep fields
Request :/cars?search=options.transmission:Auto
-
Complex example
Request :/cars?search=creationyear:2018 AND price<300000 AND (color:Yellow OR color:Blue) AND options.transmission:Auto
Roadmap
See the open issues for a list of proposed features (and known issues).
Please note that boolean parameter types are yet to be supported.
Contributing
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
License
Distributed under the MIT License. See LICENSE
for more information.
Contact
@sipios_fintech - [email protected]
Project Link: https://github.com/sipios/spring-search