Spring Data With JPA and @NamedQueries
If you use Spring Data and @NamedQuery annotations for your JPA entities, you can easily use them in a more convenient way with the Spring Data repository.
In a previous article, we created a Spring Data project using Spring Boot and Docker. We will use pretty much the same project and enhance our repository’s functionality.
We will implement a named query that will fetch employees only if their last names have 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.