Enterprise Java
Spring Data with JPA and @NamedQueries
If you use Spring Data and @NamedQuery annotations at your JPA entity you can easily use them in a more convenient way using the spring data repository.
On a previous blog we created a spring data project using spring boot and docker. We will use the pretty same project and enhance our repository’s functionality.
We will implement a named query that will fetch employees only if their Last Name has as many characters as the ones specified.
package com.gkatzioura.springdata.jpa.persistence.entity; import javax.persistence.*; /** * Created by gkatzioura on 6/2/16. */ @Entity @Table(name = "employee", schema="spring_data_jpa_example") @NamedQuery(name = "Employee.fetchByLastNameLength", query = "SELECT e FROM Employee e WHERE CHAR_LENGTH(e.lastname) =:length " ) public class Employee { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; @Column(name = "firstname") private String firstName; @Column(name = "lastname") private String lastname; @Column(name = "email") private String email; @Column(name = "age") private Integer age; @Column(name = "salary") private Integer salary; public Long getId() { return id; } public void setId(Long id) { this.id = id; } 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 String getEmail() { return email; } public void setEmail(String email) { this.email = email; } 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; } }
Pay extra attention to the query name and the convention we follow @{EntityName}.{queryName}.
Then we will add the method to our spring data repository.
package com.gkatzioura.springdata.jpa.persistence.repository; import com.gkatzioura.springdata.jpa.persistence.entity.Employee; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; /** * Created by gkatzioura on 6/2/16. */ @Repository public interface EmployeeRepository extends JpaRepository<Employee,Long>, EmployeeRepositoryCustom { List<Employee> fetchByLastNameLength(@Param("length") Long length); }
And last but not least add some functionality to our controller.
package com.gkatzioura.springdata.jpa.controller; import com.gkatzioura.springdata.jpa.persistence.entity.Employee; import com.gkatzioura.springdata.jpa.persistence.repository.EmployeeRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * Created by gkatzioura on 6/2/16. */ @RestController public class TestController { @Autowired private EmployeeRepository employeeRepository; @RequestMapping("/employee") public List<Employee> getTest() { return employeeRepository.findAll(); } @RequestMapping("/employee/filter") public List<Employee> getFiltered(String firstName,@RequestParam(defaultValue = "0") Double bonusAmount) { return employeeRepository.getFirstNamesLikeAndBonusBigger(firstName,bonusAmount); } @RequestMapping("/employee/lastnameLength") public List<Employee> fetchByLength(Long length) { return employeeRepository.fetchByLastNameLength(length); } }
You can find the source code on github.
Reference: | Spring Data with JPA and @NamedQueries from our JCG partner Emmanouil Gkatziouras at the gkatzioura blog. |