一 首先熟悉几种jpa中的接口Repository,CrudRepository,PagingAndSortingRepository,JpaRepository,JpaSpecificationExecutor

Repository是一个空接口:

@Indexed
public interface Repository<T, ID> {}

  

CrudRepository继承Repository:

@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {<S extends T> S save(S var1); //保存<S extends T> Iterable<S> save(Iterable<S> var1);//批量保存T findOne(ID var1);//根据id 查询一个对象。返回对象本身,当对象不存在时,返回nullboolean exists(ID var1)//根据id 判断对象是否存在Iterable<T> findAll();;//查询所有的对象Iterable<T> findAllById(Iterable<ID> var1);//根据id列表查询所有的对象long count();//计算对象的总个数void delete(ID var1);//根据id 删除void delete(T var1);//删除一个对象void delete(Iterable<? extends T> var1);//批量删除,集合对象(后台执行时,一条一条删除)void deleteAll();//删除所有(后台执行时,一条一条删除)
}

  

PagingAndSortingRepository继承CrudRepository,另提供了两个方法,实现了分页和排序的功能:

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {Iterable<T> findAll(Sort var1);// 仅排序Page<T> findAll(Pageable var1);// 分页和排序
}

  

JpaRepository继承PagingAndSortingRepository:

@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {List<T> findAll(); //查询所有对象,返回ListList<T> findAll(Sort var1);//查询所有对象,并排序,返回ListList<T> findAll(Iterable<ID> var1);//根据id列表查询所有的对象,返回List<S extends T> List<S> save(Iterable<S> var1);//批量保存,并返回对象Listvoid flush();//强制缓存与数据库同步<S extends T> S saveAndFlush(S var1);//保存并强制同步数据库void deleteInBatch(Iterable<T> var1);//批量删除集合对象(后台执行时,生成一条语句执行,用多个or条件)void deleteAllInBatch();//删除所有(执行一条语句,如:delete from user)T getOne(ID var1);//根据id 查询一个对象,返回对象的引用(区别于findOne),当对象不存时,返回引用不是null,但各个属性值是null<S extends T> List<S> findAll(Example<S> var1);//根据实例查询<S extends T> List<S> findAll(Example<S> var1, Sort var2);//根据实例查询,并排序
}

  

JpaSpecificationExecutor做动态SQL查询L:

/*** Interface to allow execution of {@link Specification}s based on the JPA criteria API.*/
public interface JpaSpecificationExecutor<T> {T findOne(Specification<T> var1); //通过Specification查询单个对象List<T> findAll(Specification<T> var1); //通过Specification查询集合Page<T> findAll(Specification<T> var1, Pageable var2); //通过Specification分页查询List<T> findAll(Specification<T> var1, Sort var2); //通过Specification排序查询long count(Specification<T> var1);//通过Specification统计
}

  

二 常用使用方式

1 用JpaRepository接口进行单表命名规范查询:

Keyword
Sample
JPQL snippet

And

findByLastnameAndFirstname

… where x.lastname = ?1 and x.firstname = ?2

Or

findByLastnameOrFirstname

… where x.lastname = ?1 or x.firstname = ?2

Is,Equals

findByFirstname,findByFirstnameIs,findByFirstnameEquals

… where x.firstname = ?1

Between

findByStartDateBetween

… where x.startDate between ?1 and ?2

LessThan

findByAgeLessThan

… where x.age < ?1

LessThanEqual

findByAgeLessThanEqual

… where x.age <= ?1

GreaterThan

findByAgeGreaterThan

… where x.age > ?1

GreaterThanEqual

findByAgeGreaterThanEqual

… where x.age >= ?1

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

IsNull

findByAgeIsNull

… where x.age is null

IsNotNull,NotNull

findByAge(Is)NotNull

… where x.age not null

Like

findByFirstnameLike

… where x.firstname like ?1

NotLike

findByFirstnameNotLike

… where x.firstname not like ?1

StartingWith

findByFirstnameStartingWith

… where x.firstname like ?1(parameter bound with appended %)

EndingWith

findByFirstnameEndingWith

… where x.firstname like ?1(parameter bound with prepended %)

Containing

findByFirstnameContaining

… where x.firstname like ?1(parameter bound wrapped in %)

OrderBy

findByAgeOrderByLastnameDesc

… where x.age = ?1 order by x.lastname desc

Not

findByLastnameNot

… where x.lastname <> ?1

In

findByAgeIn(Collection<Age> ages)

… where x.age in ?1

NotIn

findByAgeNotIn(Collection<Age> ages)

… where x.age not in ?1

True

findByActiveTrue()

… where x.active = true

False

findByActiveFalse()

… where x.active = false

IgnoreCase

findByFirstnameIgnoreCase

… where UPPER(x.firstame) = UPPER(?1)

 

2 @Query自定义注解使用

public interface UserRepository extends JpaRepository<User, Long> {//这种"?1"占位符要求和参数位置对应,推荐使用别名//nativeQuery=true说明为原生SQL//@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = :emailAddress", nativeQuery = true)User findByEmailAddress(String emailAddress);//delete、update example@Modifying@Query("update User u set u.firstname = :firstname where u.lastname = :lastname")int setFixedFirstnameFor(String firstname, String lastname);@Modifying@Query("delete from User u where user.role.id = :roleId")void deleteInBulkByRoleId(long roleId);
}

  

3 利用JpaSpecificationExecutor实现动态SQL

Page<DemoUser> result = userRepository.findAll(new Specification<DemoUser>(){@Overridepublic Predicate toPredicate(Root<DemoUser> root, CriteriaQuery<?> query, CriteriaBuilder builder) {List<Predicate> predicates = new ArrayList<>();//关联查询 innerJoin<DemoUser, DemoDept> join = root.join("demoDept", JoinType.INNER);//主表条件 like 动态条件if (StringUtils.isNotBlank(demoUserDtoQueryDto.getUserName())) {predicates.add(builder.like(root.get("userName"), //属性"%" + demoUserDtoQueryDto.getUserName() + "%")); //值}//in使用测试CriteriaBuilder.In<Long> in = builder.in(root.get("id"));Arrays.asList(1L, 2L, 3L).forEach(e -> {in.value(e);});predicates.add(in);//从表条件 id=1predicates.add(builder.equal(join.get("id"), 1)); //从表条件查询 这里测试//or使用 (password=4 or sex=1)predicates.add(builder.or(builder.equal(root.get("password"), "44"),builder.equal(root.get("sex"), "1")));//对象类型比较要求比较器//<Y extends Comparable<? super Y>> Predicate greaterThanOrEqualTo(Expression<? extends Y> x, Expression<? extends Y> y);//   builder.greaterThanOrEqualTo();//   builder.lessThanOrEqualTo();//   builder.greaterThan();//   builder.lessThan();//直接用与数值类型的值进行比较//Predicate gt(Expression<? extends Number> x, Expression<? extends Number> y);//   builder.gt();//   builder.le();return builder.and(predicates.toArray(new Predicate[predicates.size()]));//    query.where(predicates.toArray(new Predicate[predicates.size()]));//    return null;}},new PageRequest(page, pageSize); //分页参数 还可以添加排序字段
);// ---------------------------------------------------------------------------------------
// Entity
@Entity
@Table(name = "demo_user")
@Data
public class DemoUser extends BaseDomain implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String userName;private String password;private Short sex;@ManyToOne@JoinColumn(name = "dept_id")@NotFound(action = NotFoundAction.IGNORE)private DemoDept demoDept;}// ---------------------------------------------------------------------------------------
// DAO
public interface UserRepository extends JpaRepository<DemoUser, Long>, JpaSpecificationExecutor<DemoUser> {}

  

转载于:https://www.cnblogs.com/ken-jl/p/9728071.html

SpringData JPA整理相关推荐

  1. SpringData JPA 之疑难杂症

    SpringData JPA 之疑难杂症 1.JPA自动建表不生成外键 SpringBoot项目搭配的JPA使用时候,有一对多的关系注解,那么自动会生成外键.外键在有些时候,会导致代码不能走通,我们不 ...

  2. 带你搭一个SpringBoot+SpringData JPA的环境

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Da ...

  3. idea加入springboot插件_带你搭一个SpringBoot+SpringData JPA的环境

    前言 只有光头才能变强. 不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData ...

  4. SpringData JPA条件查询、排序、分页查询

    前言 在刚开始学习的时候,在dao的定义的接口需要继承JpaRepository<T, ID>接口和JpaSpecificationExecutor< T >接口,但是一直以来 ...

  5. spring boot 整合多数据源JDBC、多数据源mybatis、多数据源springdata jpa

    目录 代码地址:(spring-boot github地址) 1.springboot整合JDBC 2.springboot整合mybatis 3.springboot整合springdata jpa ...

  6. SpringBoot简介、SpringBoot 入门程序搭建、与JDBC、Druid、Mybatis和SpringData JPA的整合

    一.SpringBoot 简介: spring boot并不是一个全新的框架,它不是spring解决方案的一个替代品,而是spring的一个封装.所以,你以前可以用spring做的事情,现在用spri ...

  7. SpringData+JPA+mysql, cannot be null when ‘hibernate.dialect‘ not set

    SpringData+JPA+mysql 8, 报错 cannot be null when 'hibernate.dialect' not set 是因为Hibernate SQL方言没有设置导致的 ...

  8. 【持久层框架】- SpringData - JPA

    SpringData - JPA

  9. 基于springdata JPA的dao层接口实现

    基于springdata JPA的dao层接口实现以及分页 1.[举例] 只需要继承 JpaRepository<实体类,主键类型> package com.tmall.tmallspri ...

  10. SpringData JPA 详解(自定义查询、分页、事务控制)

    简介 SpringData JPA是 JPA的一种实现,极大的简化了JPA的开发,原始JPA的开发,需要创建实体管理工厂,使用实体管理器定义各种查询进行CRUD操作,而SpringData JPA只需 ...

最新文章

  1. 以太坊是什么,为什么这么火?
  2. python01-变量,运算符与数据类型+位运算
  3. JavaScript实现设置或清除数字指定偏移量上的位setBit算法(附完整源码)
  4. Boost.SmartPtr 的快速 (CI) 测试
  5. 杰克逊JSON解析错误-UnrecognizedPropertyException:无法识别的字段,未标记为可忽略[已解决]...
  6. django+mysql+插入数据库网页展示内容
  7. Docker 修改容器名称
  8. Win10 下Visual Studio 2017源码编译Paddle
  9. ASP.NET AJAX Advance Tips Tricks (9) DropDownList在Firefox下的奇怪现象和解决方案——谁的BUG?...
  10. mysql怎么生成sql文件_sql如何生成sql文件
  11. 匈牙利算法解决指派问题(java版)
  12. 将VS2010的工程转换为VS2005,即用VS2005打开
  13. Java实现:冒泡排序
  14. cad补全三视图_cad补画三视图练习题.doc
  15. Linux下SD卡格式化,为SD卡分区
  16. My Java 总结
  17. 研发和测试在多国陆续展开 全球央行数字货币研发驶入快车道
  18. 设断点报错:Frames are not available
  19. 爱签电子合同助力无纸化办公,青岛将推行存量房网签合同电子签名
  20. 大三计算机保研er现在还能参加哪些竞赛?

热门文章

  1. Java基础零碎知识点总结(持续补充)
  2. 99个wordpress经典插件
  3. spring读取配置文件
  4. POJ 1166 The Clocks
  5. ODAC(V9.5.15) 学习笔记(十六)直接访问模式
  6. golang学习的点点滴滴:if、switch使用
  7. Report Service中报 RSClientController 未定义
  8. Java的自动拆箱和装箱是Java语言的一颗语法糖
  9. JVM 怎么判断对象已经死了?
  10. 小型电商Web架构!小而美!值得学习!