Spring Data非常方便,并且避免了样板代码,从而加快了开发速度。 但是,在某些情况下,注释查询不足以实现您可能想要实现的自定义功能。

因此,spring数据允许我们向Spring数据存储库添加自定义方法。 我将使用前一篇博客文章中的相同项目结构。

我们有一个名为Employee的实体

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")
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;}
}

还有Spring Data存储库

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.stereotype.Repository;/*** Created by gkatzioura on 6/2/16.*/
@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long>{}

假设我们要添加一些自定义的sql功能,例如使用LIKE语句查询并与未映射为实体的表联接。

这仅用于演示目的。 对于您的项目,您可能会有更好的架构。 再加上spring数据具有类似语句的开箱即用功能,请查看EndingWith,Containing,StartingWith 。

我们将创建奖金表并添加对雇员表的引用。

set schema 'spring_data_jpa_example';create table bonus(id serial primary key,employee_id integer,amount real,foreign key (employee_id) references employee (id),unique (employee_id));insert into bonus
( employee_id, amount)
VALUES(1, 100);

我们要实现的sql查询将查询名称以指定文本开头且奖金大于一定数量的员工。 在jdbc中,我们必须传递与字符'%'串联在一起的变量。

所以我们需要一个像这样的本地jpa查询

Query query = entityManager.createNativeQuery("select e.* from spring_data_jpa_example.bonus b, spring_data_jpa_example.employee e\n" +"where e.id = b.employee_id " +"and e.firstname LIKE ? " +"and b.amount> ? ", Employee.class);query.setParameter(1, firstName + "%");query.setParameter(2, bonusAmount);

为了将此功能添加到我们的spring数据存储库中,我们必须添加一个接口。 我们的界面必须遵循$ {Original Repository name} Custom的命名约定。 因此,描述我们自定义功能的界面应为

package com.gkatzioura.springdata.jpa.persistence.repository;import com.gkatzioura.springdata.jpa.persistence.entity.Employee;import java.util.List;/*** Created by gkatzioura on 6/3/16.*/
public interface EmployeeRepositoryCustom {List<Employee> getFirstNamesLikeAndBonusBigger(String firstName, Double bonusAmount);}

实施应该是

package com.gkatzioura.springdata.jpa.persistence.repository;import com.gkatzioura.springdata.jpa.persistence.entity.Employee;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List;/*** Created by gkatzioura on 6/3/16.*/
@Repository
@Transactional(readOnly = true)
public class EmployeeRepositoryImpl implements EmployeeRepositoryCustom {@PersistenceContextEntityManager entityManager;@Overridepublic List<Employee> getFirstNamesLikeAndBonusBigger(String firstName, Double bonusAmount) {Query query = entityManager.createNativeQuery("select e.* from spring_data_jpa_example.bonus b, spring_data_jpa_example.employee e\n" +"where e.id = b.employee_id " +"and e.firstname LIKE ? " +"and b.amount> ? ", Employee.class);query.setParameter(1, firstName + "%");query.setParameter(2, bonusAmount);return query.getResultList();}
}

并且我们应该更改原始的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.stereotype.Repository;/*** Created by gkatzioura on 6/2/16.*/
@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long>, EmployeeRepositoryCustom {
}

似乎是一种不错的构图方式。 现在让我们向控制器添加一个方法,该方法将调用此自定义方法

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 {@Autowiredprivate 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);}}

源代码可以在github上找到。

翻译自: https://www.javacodegeeks.com/2016/06/add-custom-functionality-spring-data-repository.html

将自定义功能添加到Spring数据存储库相关推荐

  1. 通过委托增强Spring数据存储库

    我最近写了几篇有关Kotlin代表团的文章. 通过这样做,我实现了一种将其应用于Spring Data存储库的有用方法. 这将使Spring Data在提供定制路线的同时继续散布一些魔力. 这篇文章中 ...

  2. 将EntityManager.refresh添加到所有Spring数据存储库

    在我以前的文章<从Spring Data JPA访问EntityManager>中,我展示了如何扩展单个Spring Data JPA存储库以访问EntityManager.refresh ...

  3. 小型数据库_如果您从事“小型科学”工作,那么您是否正在利用数据存储库?

    小型数据库 If you're a scientist, especially one performing a lot of your research alone, you probably ha ...

  4. 大数据:70多个网站让你免费获取大数据存储库

    大数据:70多个网站让你免费获取大数据存储库 你是否需要大量的数据来检验你的APP性能?最简单的方法是从网上免费数据存储库下载数据样本.但这种方法最大的缺点是数据很少有独特的内容并且不一定能达到预期的 ...

  5. spring jpa 流式_从响应式Spring Data存储库流式传输实时更新

    spring jpa 流式 这篇文章详细介绍了从数据库到对该数据感兴趣的任何其他组件进行流更新的幼稚实现. 更准确地说,如何更改Spring Data R2DBC存储库以向相关订阅者发出事件. 对R2 ...

  6. 从响应式Spring Data存储库流式传输实时更新

    这篇文章详细介绍了从数据库到对该数据感兴趣的任何其他组件进行流更新的幼稚实现. 更确切地说,如何更改Spring Data R2DBC存储库以向相关订阅者发出事件. 对R2DBC和Spring的一点背 ...

  7. 在 Ubuntu 上添加或删除 PPA 存储库

    在 Linux 系统上,要安装的软件包通常可以通过 sources.list 文件获得.但是您可以找到一些不是由您的官方 Linux 系统团队维护的软件包.本文将向您展示如何在 Ubuntu 18.0 ...

  8. 5G NGC — UDR 统一数据存储库,UDSF 非结构化数据存储功能

    目录 文章目录 目录 计算与存储分离 增强网络执行效率 增强网元容灾冗余 UDR 与 UDSF UDR UDSF 计算与存储分离 增强网络执行效率 在 4G EPC 中,用户签约信息被存储在 HSS ...

  9. java 分页 不 排序_java - 我应该如何将未分页但已排序的Pageable传递给Spring JPA存储库? - 堆栈内存溢出...

    现在,我实现了自己的Pageable类,如下所示: import org.springframework.data.domain.Pageable; import org.springframewor ...

最新文章

  1. R语言构建xgboost模型:基于稀疏数据(dgCMatrix which is a sparse matrix)、稠密数据(dense matrix)、xgb.DMatrix数据聚合
  2. 【keras】Input 0 of layer conv2d is incompatible with the layer. expected ndim=4, found ndim=3
  3. 何恺明团队新作!深度学习网络架构新视角:通过相关图表达理解神经网络
  4. go 自定义error怎么判断是否相等_Go Web 小技巧(二)GORM 使用自定义类型
  5. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(五)
  6. [PY3]——IO——文件目录操作
  7. 【clickhouse】clickhouse时区
  8. 如何:写入文本文件(C# 编程指南)
  9. 你必不可能错过的java开源商城项目
  10. 第三课 protel学习系列——protel功能拓展
  11. Eclipse搭建Android开发环境并运行Android项目 (详细)
  12. 如何不授权情况下获取自己微信openid/傻瓜式获取
  13. 关于 Linux 中 signal 函数信号处理的讨论
  14. vector的earse造成迭代器失效的问题
  15. 开发游戏十年,遭遇游戏开发史上最诡异事件,然而被我成功解决了!
  16. (html)音乐之原生js简单的歌词滚动hah
  17. 谷仓的安保【DFS】
  18. APP调用支付宝支付
  19. xshell-xftp
  20. 树莓派搭建远程视频监控教程

热门文章

  1. Spring @Required 注释
  2. 面象对象设计6大原则之五:依赖倒置原则
  3. @Controller,@Service,@Repository,@Component详解
  4. Nodejs第一讲记录
  5. 使用JDBCTemplate实现与Spring结合,方法公用 ——共用实现类(BaseImpl)
  6. 购物车的功能——JS源码
  7. 去掉字符串后面所有的0 去掉字符串前面或后面的0;
  8. 输入一个英文句子,翻转句子中单词的顺序 例如输入“I am a student.”,则输出“student. a am I”。
  9. 18000 6c java_面向ISO18000-6C协议的无源超高频射频识别标签芯片设计
  10. 2020最新Java线程池入门(超详细)