如果您在 JPA 实体中使用 Spring Data 和 @NamedQuery 注释,您可以使用 spring 数据存储库以更方便的方式轻松使用它们。
在之前的博客中,我们使用 spring boot 和 docker 创建 了一个 spring 数据项目。我们将使用完全相同的项目并增强我们存储库的功能。
我们将实现一个命名查询,只有当员工的姓氏与指定的字符一样多时,该查询才会获取员工。
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; } }
请特别注意查询名称和我们遵循的约定 @{EntityName}.{queryName}。然后我们将该方法添加到我们的 spring 数据存储库中。
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); }
最后但并非最不重要的是向我们的控制器添加一些功能。
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); } }
您可以在 github 上找到源代码。
标签2: Java教程地址:https://www.cundage.com/article/jcg-spring-data-jpa-namedqueries.html