Spring Data JPA中踩过的坑

说老实话,Spring Data JPA很好用,上次使用还是2013年,当时只是完成Java Bean和数据库中表的映射。

最近想起来用Spring Data JPA的起因是手头有一个项目,源代码是用原生SQL+JDBC实现的,在第一次部署时要初始化数据库,还hardcode了很多数据库配置参数。正好最近有空,就打算用Spring Boot Data JPA(spring-boot-starter-data-jpa)改造一下,仔细看了一下源代码发现和几年前已经天差地别,如果你的业务逻辑不是特别复杂或者表结构设计合理,一行真正SQL逻辑实现都不要写,良心啊,真是为我这样的懒人着想啊。

首先开始写Repository,常见的用法有两种,一个是写一个接口继承JpaRepository,代码如下:

package com.company.inventory.repository;

import java.util.List;

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

import comcompany.inventory.model.Device;

public interface DeviceRepository extends JpaRepository<Device, Long> {

List<Device> findBySnOrderByGmtCreatedDesc(String sn);

}

另外一个是继承CrudRepository,代码如下:

package com.company.inventory.repository;

import java.util.List;

import org.springframework.data.repository.CrudRepository;

import comcompany.inventory.model.Device;

public interface DeviceRepository extends CrudRepository<Device, Long> {

List<Device> findBySnOrderByGmtCreatedDesc(String sn);

}

JpaRepository和CrudRepository关系如下:

public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T>

public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID>

public interface CrudRepository<T, ID> extends Repository<T, ID>

从上面的关系就能看出JpaRepository除了能做CrudRepository能做的所有事外,还多了分页和排序功能以及QueryByExampleExecutor提供的QueryByExample功能。但是JpaRepository也和JPA持久化技术进行了绑定。http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/

所以建议尽量使用CrudRepository或者PagingAndSortingRepository

原文地址:https://www.cnblogs.com/siodoon/p/11407666.html

时间: 2024-10-20 18:32:19

Spring Data JPA中踩过的坑的相关文章

Spring data JPA中使用Specifications动态构建查询

有时我们在查询某个实体的时候,给定的条件是不固定的,这是我们就需要动态 构建相应的查询语句,在JPA2.0中我们可以通过Criteria接口查询,JPA criteria查询.相比JPQL,其优势是类型安全,更加的面向对象.而在Spring data JPA中相应的接口是JpaSpecificationExecutor,这个接口基本是围绕着Specification接口来定义的. Specification接口中只定义了如下一个方法: Predicate toPredicate(Root<T>

Spring data jpa中Query和@Query分别返回map结果集

引用: http://blog.csdn.net/yingxiake/article/details/51016234 http://blog.csdn.net/yingxiake/article/details/51016234 http://www.cnblogs.com/zj0208/p/6008627.html Query的使用: 在JPA 2.0 中我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句. 但当我们查询结果没有对应实体类时,

Spring Data JPA 中使用Update Query更新实体类问题

在jpa中使用@Modifying 虽然事务已经能够更新,但是在循环更新的时候,执行modify语句后的查询的实体仍然是没有更新的. 执行完modifying query, EntityManager可能会包含过时的数据,因为EntityManager不会自动清除实体.只有添加clearAutomatically属性,EntityManager才会自动清除实体对象. @Modifying(clearAutomatically = true)

spring data JPA 中的多属性排序---养老院管理系统涉及技术整理

在此介绍我所用的一种方式: 第一步,引包 import org.springframework.data.domain.Sort;import org.springframework.data.domain.Sort.Order; 第二步,service方法代码 @Override public Page<TurnOverRecord> findAll(Integer pageNum, Integer pageSize, TurnOverRecord turnOverRecord) {//先按

Spring Data JPA中的mappedBy

mappedBy单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段 数据库中一对多的关系,关联关系总是被多方维护的即外键建在多方,我们在单方对象的@OneToMany(mappedBy="xxx") mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段 数据库中一对多的关系,关联关系总是被多方维护的即外键建在多方,我们在单方对象的@OneToMany(mappedby="xxx ") 把关系的维护交给多方对象的属性去维

【spring data jpa】spring data jpa 中的update 更新字段,如果原字段值为null不处理,不为null则在原来的值上加一段字符串

示例代码: /** * 如果barCode字段值为null则不处理 * 如果barCode字段值不为null则在原本值的前面拼接 del: * @param dealer * @return */ @Modifying @Transactional @Query("update Dealer d set " + " d.deleteFlag = 1 ," + " d.barCode = CASE WHEN d.barCode IS NULL THEN d.

Spring Boot中使用Spring Data JPA示例

JPA是Java Persistence API的简称,是sun公司早期推出的Java持久层规范,目前实现JPA规范的主流框架有Hibernate.OpenJPA等.Hibernate框架是当前较为流行的JPA实现之一,在Spring Data JPA中,默认底层实现也是使用的Hibernate. Spring Data JPA示例搭建 Spring Boot 提供了一个"spring-boot-starter-data-jpa"模块,在项目中使用这个模块,就可以简单的整合Spring

Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL

在数据访问这章的第一篇文章<Spring中使用JdbcTemplate访问数据库> 中,我们已经介绍了如何使用Spring Boot中最基本的jdbc模块来实现关系型数据库的数据读写操作.那么结合Web开发一章的内容,我们就可以利用JDBC模块与Web模块的功能,综合着使用来完成一个适用于很多简单应用场景的后端应用了. 然而当我们有一定的开发经验之后,不难发现,在实际开发过程中,对数据库的操作大多可以归结为:"增删改查".就最为普遍的单表操作而言,除了表和字段不同外,语句几

Spring Data JPA进阶——Specifications和Querydsl

Spring Data JPA进阶--Specifications和Querydsl 本篇介绍一下Spring Data JPA中能为数据访问程序的开发带来更多便利的特性,我们知道,Spring Data repository的配置很简单,一个典型的repository像下面这样: public interface CustomerRepository extends JpaRepository<Customer, Long> { Customer findByEmailAddress(Str