├── README.md ├── src ├── main │ ├── java │ │ └── com │ │ │ └── javatechie │ │ │ └── jpastreamer │ │ │ ├── repository │ │ │ └── EmployeeRepository.java │ │ │ ├── SpringBootJpastreamerApplication.java │ │ │ ├── entity │ │ │ └── Employee.java │ │ │ ├── controller │ │ │ └── EmployeeController.java │ │ │ └── service │ │ │ └── EmployeeService.java │ └── resources │ │ ├── application.properties │ │ └── payload.json └── test │ └── java │ └── com │ └── javatechie │ └── jpastreamer │ └── SpringBootJpastreamerApplicationTests.java └── pom.xml /README.md: -------------------------------------------------------------------------------- 1 | # spring-boot-jpastreamer 2 | Express JPA Queries as Java Streams 3 | 4 | ![JPAStreamer_table](https://user-images.githubusercontent.com/25712816/128547952-d59a6936-de3d-47f4-9ecd-188829c02e2b.PNG) 5 | -------------------------------------------------------------------------------- /src/main/java/com/javatechie/jpastreamer/repository/EmployeeRepository.java: -------------------------------------------------------------------------------- 1 | package com.javatechie.jpastreamer.repository; 2 | 3 | import com.javatechie.jpastreamer.entity.Employee; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface EmployeeRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /src/test/java/com/javatechie/jpastreamer/SpringBootJpastreamerApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.javatechie.jpastreamer; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class SpringBootJpastreamerApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/javatechie/jpastreamer/SpringBootJpastreamerApplication.java: -------------------------------------------------------------------------------- 1 | package com.javatechie.jpastreamer; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SpringBootJpastreamerApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SpringBootJpastreamerApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name: sample-spring-jpa-streamer 2 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 3 | spring.datasource.url = jdbc:mysql://localhost:3306/javatechie 4 | spring.datasource.username = root 5 | spring.datasource.password = Password 6 | spring.jpa.show-sql = true 7 | spring.jpa.properties.hibernate.format_sql=true 8 | spring.jpa.hibernate.ddl-auto = update 9 | spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 10 | server.port=9191 -------------------------------------------------------------------------------- /src/main/java/com/javatechie/jpastreamer/entity/Employee.java: -------------------------------------------------------------------------------- 1 | package com.javatechie.jpastreamer.entity; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.persistence.Entity; 8 | import javax.persistence.GeneratedValue; 9 | import javax.persistence.Id; 10 | import javax.persistence.Table; 11 | 12 | @Entity 13 | @Table(name = "EMPLOYEE_RECORD") 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | public class Employee { 18 | @Id 19 | @GeneratedValue 20 | private int id; 21 | private String name; 22 | private String dept; 23 | private double salary; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/resources/payload.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Basant", 4 | "dept": "DEV", 5 | "salary": 50000 6 | }, 7 | { 8 | "name": "Santosh", 9 | "dept": "UI", 10 | "salary": 60000 11 | }, 12 | { 13 | "name": "Rakesh", 14 | "dept": "DEV", 15 | "salary": 40000 16 | }, 17 | { 18 | "name": "Ashik", 19 | "dept": "DEV", 20 | "salary": 70000 21 | }, 22 | { 23 | "name": "Bikash", 24 | "dept": "QA", 25 | "salary": 30000 26 | }, 27 | { 28 | "name": "John", 29 | "dept": "UI", 30 | "salary": 80000 31 | }, 32 | { 33 | "name": "peter", 34 | "dept": "QA", 35 | "salary": 60000 36 | }, 37 | { 38 | "name": "sam", 39 | "dept": "ADMIN", 40 | "salary": 20000 41 | }, 42 | { 43 | "name": "Sankar", 44 | "dept": "TRANSPORTATION", 45 | "salary": 30000 46 | }, 47 | { 48 | "name": "kiran", 49 | "dept": "ADMIN", 50 | "salary": 15000 51 | } 52 | ] -------------------------------------------------------------------------------- /src/main/java/com/javatechie/jpastreamer/controller/EmployeeController.java: -------------------------------------------------------------------------------- 1 | package com.javatechie.jpastreamer.controller; 2 | 3 | import com.javatechie.jpastreamer.entity.Employee; 4 | import com.javatechie.jpastreamer.service.EmployeeService; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.*; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | @RestController 12 | @RequestMapping("/employees") 13 | public class EmployeeController { 14 | 15 | @Autowired 16 | private EmployeeService service; 17 | 18 | @PostMapping 19 | public List saveEmployees(@RequestBody List employees){ 20 | return service.saveEmployees(employees); 21 | } 22 | 23 | @GetMapping("/{offset}/{limit}") 24 | public List getEmployees(@PathVariable int offset,@PathVariable int limit) { 25 | return service.getEmployees(offset,limit); 26 | } 27 | 28 | @GetMapping("/{dept}") 29 | public List getEmployeesByDept(@PathVariable String dept) { 30 | return service.getEmployeesByDept(dept); 31 | } 32 | 33 | @GetMapping("/fetch/{dept}/{salary}") 34 | public List getEmployeesByDeptAndSalary(@PathVariable String dept,@PathVariable double salary) { 35 | return service.getEmployeesByDeptAndSalary(dept,salary); 36 | } 37 | 38 | @GetMapping("/range/{sal1}/{sal2}") 39 | public List getEmployeesBySalaryRange(@PathVariable double sal1,@PathVariable double sal2) { 40 | return service.getEmployeeBySalaryRange(sal1, sal2); 41 | } 42 | 43 | @GetMapping("/min") 44 | public Employee getLessPaidEmployee(){ 45 | return service.minPaidEmp(); 46 | } 47 | 48 | @PostMapping("/ids") 49 | public List getEmployeesByIds(@RequestBody List ids){ 50 | return service.getEmployeesByIds(ids); 51 | } 52 | 53 | @GetMapping("/groupByDept") 54 | public Map> getEmployeeGroupByDept(){ 55 | return service.getEmployeeGroupByDept(); 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/javatechie/jpastreamer/service/EmployeeService.java: -------------------------------------------------------------------------------- 1 | package com.javatechie.jpastreamer.service; 2 | 3 | import com.javatechie.jpastreamer.entity.Employee; 4 | import com.javatechie.jpastreamer.entity.Employee$; 5 | import com.javatechie.jpastreamer.repository.EmployeeRepository; 6 | import com.speedment.jpastreamer.application.*; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.Comparator; 11 | import java.util.List; 12 | import java.util.Map; 13 | import java.util.stream.Collectors; 14 | 15 | @Service 16 | public class EmployeeService { 17 | 18 | @Autowired 19 | private EmployeeRepository repository; 20 | 21 | @Autowired 22 | private JPAStreamer jpaStreamer; 23 | 24 | 25 | public List saveEmployees(List employees) { 26 | return repository.saveAll(employees); 27 | } 28 | 29 | public List getEmployees(int offset,int limit){ 30 | return jpaStreamer.stream(Employee.class) 31 | .sorted(Employee$.name) 32 | .skip(offset) 33 | .limit(limit) 34 | .collect(Collectors.toList()); 35 | } 36 | 37 | public List getEmployeesByDept(String dept){ 38 | return jpaStreamer.stream(Employee.class) 39 | .filter(Employee$.dept.equal(dept)) 40 | .collect(Collectors.toList()); 41 | } 42 | 43 | public List getEmployeesByDeptAndSalary(String dept,double salary){ 44 | return jpaStreamer.stream(Employee.class) 45 | .filter(Employee$.dept.equal(dept) 46 | .and(Employee$.salary.greaterOrEqual(salary))) 47 | .collect(Collectors.toList()); 48 | } 49 | 50 | public List getEmployeeBySalaryRange(double salary1,double salary2){ 51 | return jpaStreamer.stream(Employee.class) 52 | .filter(Employee$.salary.between(salary1,salary2)) 53 | .collect(Collectors.toList()); 54 | } 55 | 56 | //aggregate fun 57 | 58 | public Employee minPaidEmp(){ 59 | return jpaStreamer.stream(Employee.class) 60 | .min(Comparator.comparing(Employee::getSalary)).get(); 61 | } 62 | 63 | public List getEmployeesByIds(List ids){ 64 | return jpaStreamer.stream(Employee.class) 65 | .filter(Employee$.id.in(ids)) 66 | .collect(Collectors.toList()); 67 | } 68 | 69 | public Map> getEmployeeGroupByDept(){ 70 | return jpaStreamer.stream(Employee.class) 71 | .collect(Collectors.groupingBy(Employee::getDept)); 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.5.3 9 | 10 | 11 | com.javatechie 12 | spring-boot-jpastreamer 13 | 0.0.1-SNAPSHOT 14 | spring-boot-jpastreamer 15 | Demo project for Spring Boot 16 | 17 | 1.8 18 | 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-data-jpa 23 | 24 | 25 | org.springframework.boot 26 | spring-boot-starter-web 27 | 28 | 29 | 30 | mysql 31 | mysql-connector-java 32 | runtime 33 | 34 | 35 | org.projectlombok 36 | lombok 37 | true 38 | 39 | 40 | org.springframework.boot 41 | spring-boot-starter-test 42 | test 43 | 44 | 45 | com.speedment.jpastreamer 46 | jpastreamer-core 47 | 1.0.1 48 | 49 | 50 | com.speedment.jpastreamer.integration.spring 51 | spring-boot-jpastreamer-autoconfigure 52 | 1.0.1 53 | 54 | 55 | 56 | 57 | 58 | 59 | org.springframework.boot 60 | spring-boot-maven-plugin 61 | 62 | 63 | 64 | org.projectlombok 65 | lombok 66 | 67 | 68 | 69 | 70 | 71 | org.codehaus.mojo 72 | build-helper-maven-plugin 73 | 3.2.0 74 | 75 | 76 | generate-sources 77 | 78 | add-source 79 | 80 | 81 | 82 | 83 | ${project.build.directory}/generated-sources/annotations 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | --------------------------------------------------------------------------------