Spring Data JPA

Spring Data Jpa最佳实践

与世无争的帅哥 提交于 2019-12-04 06:33:26
前言 Spring Data Jpa框架的目标是显著减少实现各种持久性存储的数据访问层所需的样板代码量。Spring Data Jpa存储库抽象中的中央接口是Repository。它需要领域实体类以及领域实体ID类型作为类型参数来进行管理。该接口主要用作标记接口,以捕获要使用的类型并帮助您发现扩展该接口的接口。CrudRepository、JpaRepository是更具体的数据操作抽象,一般我们在项目中使用的时候定义我们的领域接口然后继承CrudRepository或JpaRepository即可实现实现基础的CURD方法了,但是这种用法有局限性,不能处理超复杂的查询,而且稍微复杂的查询代码写起来也不是很优雅,所以下面看看怎么最优雅的解决这个问题。 扩展接口用法 /** * @author: kl @kailing.pub * @date: 2019/11/11 */ @Repository public interface SendLogRepository extends JpaRepository<SendLog,Integer> { /** * 派生的通过解析方法名称的查询 * @param templateName * @return */ List<SendLog> findSendLogByTemplateName(String templateName); /**

Spring Boot + Spring Data JPA 项目整合开发记录(持续更新)

空扰寡人 提交于 2019-12-04 05:09:25
刚换了公司,项目架构师提出新的系统架构时还是愣了一下,搭建难度较低,很容易上手,但是对Spring Data JPA的了解不够深入,所以还是有些吃力,在框架搭建初期有许多东西并没有很好的集成。 20180714-这个项目表与表之间的耦合度太低了,且不允许在实体类中进行外键对象关联,一对多、多对一、多对多的关系处理就比较复杂了,Spring Data JPA提供了好几种不同的接口调用方式,因此什么时候使用什么样的方法显得尤为重要,不同的方法编写方式也不太一样,在数据处理方面比较头疼,如果需要抽取不同表之间的数据为结果,要做联合查询且需要额外在声明一个相应的实体类来接受,不然就只能将外键表字段存储到本表中,相当费劲。 框架体系 Spring Boot + Spring Data JPA + Spring Security + Spring Security oAuth2.0 + Thymeleaf Spring Boot Spring Data JPA Spring Security Thymeleaf Vue.js Vue Element-ui Node.js 与 NPM(辅助,安装Node后,NPM会附带安装),附带webpack工具、路由等。 实体类中并没有声明 任何外键关联关系 ,因此我们查询了许多种方法来解决外键关联查询并返回结果的方法。 Spring Data JPA -

kotlin使用spring data jpa(一)

情到浓时终转凉″ 提交于 2019-12-03 19:48:07
简单查询 spring data jpa是spring全家桶成员之一,用于操作各种数据库,下面写一个查询订单的简单示例 引入sqlserver驱动包及jpa所需包 implementation('org.springframework.boot:spring-boot-starter-data-jpa') runtimeOnly('com.microsoft.sqlserver:mssql-jdbc') 2.配置连接字符串 spring.datasource.url=jdbc:sqlserver://machinename or ip:1433;database=dbname spring.datasource.username=username spring.datasource.password=password spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #关闭初始化数据库 spring.jpa.generate-ddl=false

kotlin使用spring data jpa(三)

99封情书 提交于 2019-12-03 08:05:16
使用QueryDSL集成查询 QueryDSL是什么? QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询。 Querydsl可以通过一组通用的查询API为用户构建出适合不同类型ORM框架或者是SQL的查询语句,也就是说QueryDSL是基于各种ORM框架以及SQL之上的一个通用的查询框架。 借助QueryDSL可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建查询。目前QueryDSL支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search 下面我们通过一个查询订单的实例来简单集成QueryDSL 首先引入QueryDSL对JPA的支持 implementation 'com.querydsl:querydsl-jpa:4.2.1' //使用kapt激活querydsl apt工具 kapt "com.querydsl:querydsl-apt:4.2.1:jpa" 执行build会发现生成 build\generated\source\kapt\main\com\example\demo2\entity\QOrderEntity.java 这个类是我们查询的条件,可以进行如下查询,当然条件是可以拼装的 val page = if

升级Java 11 后报错 nable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]

↘锁芯ラ 提交于 2019-12-03 06:16:56
java 升级到 11 后使用 spring-data-jpa 会报错 Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; ...... Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister ...... Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer] 这是因为 hibernate 实现依赖 javassist 而目前 javassist 是 3.22.0 版本,暂时不支持 java 11 ,这就是版本不支持的原因造成的 只需要升级一下 javassist 版本即可 目前是 3.23.1-GA 注意: 这种情况仅仅适用于升级 java 之前正常,升级之后出现此错误的原因

SpringBoot | 第三十章:Spring-data-jpa的集成和使用

北慕城南 提交于 2019-12-02 00:01:36
前言 在前面的 第九章:Mybatis-plus的集成和使用 章节中,介绍了使用 ORM 框架 mybatis-plus 进行数据库的访问。今天,我们来简单学习下如何使用 spring-data-jpa 进行数据库的访问。由于本人未使用过 jpa ,也是趁着写博文的机会查阅了相关资料下,有错误的地方还望指出! 一点知识 何为JPA JPA 是 Java Persistence API 的简写,是 Sun 官方提出的一种 ORM 规范! 对于 Sun 官网而言, 一是想 简化现有 Java EE 和 Java SE 应用开发工作 。 二是想 整合ORM技术,实现天下归一 。 对于 JPA 规范,都在包路径: javax.persistence.* 下,像一些常用的如: @Entity 、 @Id 及 @Transient 都在此路径下。这些也是一些现在市面上常用的 ORM 一些约定俗成的注解了。 简单来说, JPA 是一套规范。所以使用Jpa的一个好处是,可以更换实现而不必改动太多代码。 何为Sping-data-jpa Spring Data JPA 是 Spring 基于 Hibernate 开发的一个 JPA 框架。可以极大的简化 JPA 的写法,可以在几乎不用写具体代码的情况下,实现对数据的访问和操作。除了 CRUD 外,还包括如 分页 、 排序 等一些常用的功能。

译:Spring Data Repository 不区分大小写查询

我与影子孤独终老i 提交于 2019-12-01 22:22:54
使用Spring Data Repository 不区分大小写查询 原文链接: https://www.baeldung.com/spring-data-case-insensitive-queries 作者: Shubhra Srivastava 译者:liululee 1. 概览 Spring Data JPA 查询默认是大小写敏感的,换句话说,字段值的比较是区分大小写的。 本教程中,我们将探讨如何在 Spring Data JPA repository 快速新建不区分大小写的查询. 2. 依赖 首先,确保 pom.xml 包含 Spring Data 和 H2 依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.1.3.RELEASE</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> <version>1.4.199</version> </dependency> 最新版本请移步

spring data与jpa

孤者浪人 提交于 2019-12-01 19:58:50
sring data:spring底层默认进行数据访问采用的一个技术,是spring官方提供的用来简化数据访问的一个项目,在这个项目里有非常多的模块,能简化各种数据层的操作,比如spring date jpa简化关系型数据库的操作,spring data mongodb的操作,spring data redis等, spring date的理想就是统一数据层访问的api,spring data提供一些respository接口,有了spring data,我们的 应用程序只要面对spring data编程 spring data jpa:java持久化api,是叫J2EE的一个规范,操作关系型数据库,spring data预留接口,操作去实现spring data的接口就可以了 来源: oschina 链接: https://my.oschina.net/u/3788556/blog/1852853

Spring Data JPA 使用

拜拜、爱过 提交于 2019-12-01 19:58:38
Java 持久层框架访问数据库的方式大致分为两种。一种以 SQL 中心,封装一定程度的 JDBC 操作,比如 MyBatis。另一种是以 Java Entity 为中心,将实体的关系对应到数据库表之间的关系,如 ORM (Object Relational Mapping) 工具。 JAP (Java Persistence API) 就是用来整合第三方 ORM 框架的,即建立一套标准的方式。通过注解或 XML 描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 Spring Data JPA 介绍 什么是 Spring Data JPA Spring 提供的一个用于简化 JPA 开发的框架。可以极大的简化 JPA 的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。 Spring Data JPA 是 Spring Data 中的一个子模块 JPA 是一套标准接口,而 Hibernate 是 JPA 的实现,而 Spring Data JPA 底层默认实现是使用Hibernate Spring Data JPA 的首个接口就是 Repository,它是一个标记接口。只要我们的接口实现这个接口,那么我们就相当于在使用 Spring Data JPA 了。 就是说,只要我们实现了这个接口,我们就可以使用**

@OneToMany(fetch = FetchType.EAGER), FetchType.EAGER 急加载的导致查询重复明细数据的BUG

老子叫甜甜 提交于 2019-11-30 17:57:36
项目使用spring data jpa , 在配置了 多对1 和 1对 多的 表 对象关联关系之后, 同事 发现查询出来的 多的一方 ,有两个数据,而且他们的 数据id 都是一样的。 开始 他们以为是 阿里的json 序列化的时候,因为 有重复引用,循环引用问题,导致了 这个 BUG。 但是 他 设置了 fastjson 禁止 重复引用,循环引用,都不能解决。 刚好我 注意到了,就去 了解一下这个BUG。 开始也以为是 阿里fastjson 的BUG, 但是在我 debug 查看数据的时候,发现 明细表 就是有两条一样的数据的。 那就是 他们配置 关系的时候配置错了。 关联对象代码: 一方: @OneToMany(fetch = FetchType.EAGER, mappedBy = "trade") private List<TcOrder> orderList = new ArrayList<>(); 多方: /** * 父订单ID */ @Column(name = "trade_id", nullable = true, length = 19) private Long tradeId; @ManyToOne() @JoinColumn(name = "trade_id", unique = true, insertable = false, updatable =