文档章节

Spring boot 中自定义JpaRepository使用

亚林瓜子
 亚林瓜子
发布于 2018/08/10 17:35
字数 390
阅读 30
收藏 0

普通JpaRepository类

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long>{
}

JpaRepository一般的筛选查询,均可以通过findBy的形式解决,总的很好用,但是总有一部分的业务查询是需要JpaRepository不能解决的。这个时候,就需要在此基础上面增加自定义的Repository类了。

自定义Repository类

接口类

import java.util.List;
public interface EmployeeRepositoryCustom {
    List<Employee> getFirstNamesLike(String firstName);
}

实现类

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;

@Repository
public class EmployeeRepositoryImpl implements EmployeeRepositoryCustom {
    @PersistenceContext
    private EntityManager entityManager;
    @Override
    public List<Employee> getFirstNamesLike(String firstName) {
        Query query = entityManager.createNativeQuery("SELECT em.* FROM spring_data_jpa_example.employee as em " +
                "WHERE em.firstname LIKE ?", Employee.class);
        query.setParameter(1, firstName + "%");
        return query.getResultList();
    }
}

**Note:**实现类的命名必须是这里实现类的命名bean名+RepositoryImpl;这里注入了EntityManager,关于它的标准查询,使用我放在后面再提。

使用自定义类Repository类

@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long>, EmployeeRepositoryCustom {
}

依旧按照JpaRepository的使用方式,只要简单继承就可以了。

EntityManager的标准查询

如果不想在java代码里面涉及太多的sql字符串,应该按照EntityManager的标准查询方式,进行数据库查询,如下:

@Repository
public class EmployeeRepositoryImpl implements EmployeeRepositoryCustom {
    @PersistenceContext
    private EntityManager entityManager;
    @Override
    public List<Employee> getFirstNamesLike(String firstName) {
        // Query query = entityManager.createNativeQuery("SELECT em.* FROM spring_data_jpa_example.employee as em " +
        //         "WHERE em.firstname LIKE ?", Employee.class);
        // query.setParameter(1, firstName + "%");
		// return query.getResultList();
		
		CriteriaBuilder builder = entityManager.getCriteriaBuilder();
		CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
		Root<Employee> root = query.from(Employee.class);
		Predicate predicate = builder.conjunction();

		predicate = builder.and(predicate,  builder.like(root.get("firstname"), "张三"));
		query.where(predicate);

		return entityManager.createQuery(query).getResultList();
    }
}

参考:

REST Query Language with Spring and JPA Criteria

1. Working with Spring Data Repositories

Add Custom Functionality to a Spring Data Repository

© 著作权归作者所有

亚林瓜子

亚林瓜子

粉丝 22
博文 237
码字总数 79111
作品 0
长沙
高级程序员
私信 提问
SpringBoot之redis缓存,注解方式

spring boot对缓存支持非常灵活,我们可以使用默认的EhCache,也可以整合第三方的框架,只需配置即可。SpringBoot工程使用Redis缓存,也是非常方便(网上许多博文都是自定义RedisTemplate配置...

louieSun
2018/12/04
0
0
SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问

SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问 - 一、大致介绍 Mysql数据库安装步骤 二、实现步骤 2.1 添加 maven 引用包 2.2 添加应用配置文件(springms-prov...

HMILYYLIMH
2017/10/19
0
0
Spring Boot数据库操作之Spring Boot Data JPA

版权声明:本文为博主原创文章,转载需注明出处。 https://blog.csdn.net/jay100500/article/details/81264973 作者:谭东 JPA全称是Java Persistence API,即JAVA持久层API。可以讲JDK注解的...

谭东jay
2018/07/28
0
0
spring data jpa 使用之 spring boot 2.x

准备 本人写的spring data是通过maven子父工程管理 parent项目的 : pom.xml pom.xml propertise 注意注释 !!! 默认为myisam引擎 boot2.x 的特性 一、 实体类 1.Member MemberOrder 如果用ord...

激萌区块链
2018/09/02
0
0
spring-boot 是如何实现自动配置的

spring-boot 实现了零配置集成组件,如果需要使用jpa,引入对应的starter,就在项目中自动配置好了。 IOC容器中的条件Bean spring从4.0开始支持条件bean,当判断条件为true时,bean的定义才有...

happy_jake1
2017/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用Python从0开始实现一个中文拼音输入法

众所周知,中文输入法是一个历史悠久的问题,但也实在是个繁琐的活,不知道这是不是网上很少有人分享中文拼音输入法的原因,接着这次NLP Project的机会,我觉得实现一发中文拼音输入法,看看...

计算机编程
25分钟前
4
0
阿里P7架构师对Java虚拟机、类加载机制是怎么理解的?

概述 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载 (Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化 (Initializat...

kx33389
43分钟前
0
0
日本软银孙正义表示从未命令ARM断供华为

华为虽然有自主研发的麒麟处理器,但在架构和指令集方面仍然基于 ARM,所以当 ARM 切断与华为一切联系的消息传来后,很多人对华为麒麟的未来忧心忡忡,也怀疑已经收购了 ARM 的日本软银在背后...

linuxCool
51分钟前
4
0
mongodb安装、连接,mongodb用户管理、创建集合、数据管理、备份恢复,副本集介绍、搭建、测试,分片介绍、搭建、测试,php的mongodb扩展、mongo扩展

21.26 mongodb介绍 21.27 mongodb安装 21.28 连接mongodb 21.29 mongodb用户管理 21.30 mongodb创建集合、数据管理 21.31 php的mongodb扩展 21.32 php的mongo扩展 21.33 mongodb副本集介绍 ...

tobej
今天
3
0
C++的变量初始化

C++中变量的初始化有很多种方式,如:默认初始化,值初始化,直接初始化,拷贝初始化,列表初始化。 1、默认初始化:默认初始化是指定义变量时没有指定初值时进行的初始化操作。 如:int a;...

天王盖地虎626
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部