Dynamic Query in Spring Boot
Posted By : Prakhar Verma | 24-May-2018
These are the steps for creating a dynamic query in spring boot
Step 1 => Create a simple spring boot project with name "DynamicQuery".
2. Add maven dependencies for database connection and rest API creation.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
3. Add database related configuration in the application.properties file.
#----------------------------Database Connection Configuration-------------------------#
spring.datasource.url=jdbc:mysql://localhost:3306/temp?autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.datasource.name=temp
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
#--------------------------------------------------------------------------------------#
server.port=8080
4. Create a class with named "DynamicQueryConfig" for creating
package com.dynamicquery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean;
@Configuration
public class DynamicQueryConfig {
public static Logger logger = LoggerFactory.getLogger(DynamicQueryConfig.class);
/**
* Bean for getting the handle of SessionFactory for
* Manually Creating Hibernate Session if needed.
* @return
*/
@Bean
public HibernateJpaSessionFactoryBean sessionFactory() {
logger.debug("Creating hibernate Session factoy");
HibernateJpaSessionFactoryBean hibernateJpaSessionFactoryBean = null;
try{
hibernateJpaSessionFactoryBean = new HibernateJpaSessionFactoryBean();
}catch(Exception e){
logger.debug("Exception occure while create HibernateJpaSessionFactoryBean : "+e);
}
logger.debug("HibernateJpaSessionFactoryBean created succesfully.");
return hibernateJpaSessionFactoryBean;
}
}
5. Create
package com.dynamicquery.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer employeeId;
private String email;
private String firstName;
private String lastName;
private Integer age;
private Integer salary;
private Boolean isActive;
public Employee(){}
public Integer getEmployeeId() {
return employeeId;
}
public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSalary() {
return salary;
}
public void setSalary(Integer salary) {
this.salary = salary;
}
public Boolean getIsActive() {
return isActive;
}
public void setIsActive(Boolean isActive) {
this.isActive = isActive;
}
}
6. Create
package com.dynamicquery.service;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import org.apache.catalina.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean;
import org.springframework.stereotype.Service;
import com.dynamicquery.domain.Employee;
import com.dynamicquery.domain.Req_GetEmployee;
@Service
public class EmployeeService {
public static Logger log = LoggerFactory.getLogger(EmployeeService.class);
@Autowired
private HibernateJpaSessionFactoryBean sessionFactory;
public String getValueByFieldType(Object value,Class fieldType){
if(fieldType.equals(String.class)){
return "\'"+value+"\'";
}
return value.toString();
}
public String createDynamicQuery(Object obj){
Class classObj = obj.getClass();
StringBuffer query=new StringBuffer("from "+classObj.getSimpleName());
Field[] fields = classObj.getDeclaredFields();
boolean isWhereExist=false;
for(Field field : fields){
field.setAccessible(true);
try{
Object value = field.get(obj);
if(value != null){
if(!isWhereExist){
query.append(" where "+field.getName()+" = "+getValueByFieldType(value,field.getType()));
isWhereExist = true;
}else{
query.append(" and "+field.getName()+" = "+getValueByFieldType(value,field.getType()));
}
}
}catch (Exception e) {
log.error("Exception ocuur while fetch field value : ",e);
}
}
log.info("Query is => "+query);
return query.toString();
}
public Map<String,Object> getEmployee(Employee employee){
EntityManagerFactory emf = sessionFactory.getEntityManagerFactory();
EntityManager en = emf.createEntityManager();
Query query = en.createQuery(createDynamicQuery(employee));
List<Employee> employeeList = query.getResultList();
Map<String,Object> response = new HashMap<String,Object>();
response.put("employees",employeeList );
return response;
}
}
7. Create new Controller.
package com.dynamicquery.controller;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RestController;
import com.dynamicquery.domain.Employee;
import com.dynamicquery.service.EmployeeService;
@RestController
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
public static Logger log = LoggerFactory.getLogger(EmployeeController.class);
@GetMapping(value="/employee",produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
public Map<String,Object> getEmployee(@ModelAttribute Employee employee){
log.info("Inside getEmployee API");
Map<String,Object> response = new HashMap<String,Object>();
response.put("hi","ddddddd");
try{
response = employeeService.getEmployee(employee);
response.put("isError", false);
response.put("message","Employees fetched successfully");
}catch (Exception e) {
log.error("Excption occur while fetch employee : ",e);
response.put("isError", true);
response.put("message","Employees not fetched");
}
return response;
}
}
Cookies are important to the proper functioning of a site. To improve your experience, we use cookies to remember log-in details and provide secure log-in, collect statistics to optimize site functionality, and deliver content tailored to your interests. Click Agree and Proceed to accept cookies and go directly to the site or click on View Cookie Settings to see detailed descriptions of the types of cookies and choose whether to accept certain cookies while on the site.
About Author
Prakhar Verma
Prakhar is a Web App Developer. Experienced in Java and always gives his best effort to complete the given task. He is self motivated and fun loving person.