1.1 简单查询--接口方法

1.2 五个接口详解

1.2.1    CrudRepository接口

其中T是要操作的实体类,ID是实体类主键的类型。该接口提供了11个常用操作方法。

@NoRepositoryBean

publicinterface CrudRepository<T, ID extendsSerializable> extends Repository<T, ID> {

<S extends T> S save(S entity);//保存

<S extends T> Iterable<S> save(Iterable<S> entities);//批量保存

T findOne(ID id);//根据id 查询一个对象。返回对象本身,当对象不存在时,返回null

Iterable<T> findAll();//查询所有的对象

Iterable<T> findAll(Iterable<ID> ids);//根据id列表查询所有的对象

boolean exists(ID id);//根据id 判断对象是否存在

long count();//计算对象的总个数

void delete(ID id);//根据id 删除

void delete(T entity);//删除一个对象

void delete(Iterable<? extendsT> entities);//批量删除,集合对象(后台执行时,一条一条删除)

void deleteAll();//删除所有(后台执行时,一条一条删除)

}

1.2.2    PagingAndSortingRepository接口

该接口继承了CrudRepository接口,提供了两个方法,实现了分页和排序的功能了。

@NoRepositoryBean

publicinterface PagingAndSortingRepository<T, ID extends Serializable> extendsCrudRepository<T, ID> {

Iterable<T> findAll(Sort sort);// 仅排序

Page<T>findAll(Pageable pageable);// 分页和排序

}

1.2.3       JpaRepository接口

该接口继承了PagingAndSortingRepository接口。

同时也继承QueryByExampleExecutor接口,这是个用“实例”进行查询的接口,后续再写文章详细说明。

@NoRepositoryBean

publicinterface JpaRepository<T, ID extendsSerializable>

extends PagingAndSortingRepository<T, ID>,QueryByExampleExecutor<T> {

List<T>findAll(); //查询所有对象,返回List

List<T>findAll(Sort sort); //查询所有对象,并排序,返回List

List<T>findAll(Iterable<ID> ids); //根据id列表查询所有的对象,返回List

void flush(); //强制缓存与数据库同步

<S extends T> List<S> save(Iterable<S> entities); //批量保存,并返回对象List

<S extends T> S saveAndFlush(S entity);//保存并强制同步数据库

void deleteInBatch(Iterable<T> entities);//批量删除集合对象(后台执行时,生成一条语句执行,用多个or条件)

void deleteAllInBatch();//删除所有(执行一条语句,如:delete from user)

T getOne(ID id); //根据id 查询一个对象,返回对象的引用(区别于findOne)。当对象不存时,返回引用不是null,但各个属性值是null

@Override

<S extends T> List<S> findAll(Example<S> example); //根据实例查询

@Override

<S extends T> List<S> findAll(Example<S> example, Sort sort);//根据实例查询,并排序。

}

几点说明:

(1)几个查询、及批量保存方法,和 CrudRepository 接口相比,返回的是 List,使用起来更方便。

(2)增加了InBatch 删除,实际执行时,后台生成一条sql语句,效率更高些。相比较而言,CrudRepository 接口的删除方法,都是一条一条删除的,即便是 deleteAll 也是一条一条删除的。

(3)增加了 getOne()方法,切记,该方法返回的是对象引用,当查询的对象不存在时,它的值不是Null。

1.2.4       JpaSpecificationExecutor接口

该接口提供了对JPA Criteria查询(动态查询)的支持。这个接口很有用,具体不粘源码了。

1.3   方法定义规则

符号

含义

And

并且

Or

Is,Equals

等于

Between

两者之间

LessThan

小于

LessThanEqual

小于等于

GreaterThan

大于

GreaterThanEqual

大于等于

After

之后(时间)>

Before

之前(时间)<

IsNull

等于Null

IsNotNull,NotNull

不等于Null

Like

模糊查询。查询件中需要自己加%

NotLike

不在模糊范围内。查询件中需要自己加%

StartingWith

以某开头

EndingWith

以某结束

Containing

包含某

OrderBy

排序

Not

不等于

In

某范围内

NotIn

某范围外

TRUE

FALSE

IgnoreCase

忽略大小写

1.4  解析方法名--规则说明

1.4.1   规则描述

按照Spring data定义的规则,查询方法以find|read|get开头(比如 find、findBy、read、readBy、get、getBy),涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。

如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。

1.4.2   举例说明

比如 findByUserAddressZip()。框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,详细规则如下(此处假设该方法针对的域对象为AccountInfo类型):

1.      先判断userAddressZip (根据 POJO 规范,首字母变为小写,下同)是否为AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;

2.      从右往左截取第一个大写字母开头的字符串(此处为 Zip),然后检查剩下的字符串是否为AccountInfo的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设user 为AccountInfo 的一个属性;

3.      接着处理剩下部分(AddressZip ),先判断 user 所对应的类型是否有addressZip 属性,如果有,则表示该方法最终是根据 " AccountInfo.user.addressZip" 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 " AccountInfo.user.address.zip" 的值进行查询。

可能会存在一种特殊情况,比如 AccountInfo包含一个 user 的属性,也有一个 userAddress 属性,此时会存在混淆。读者可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_AddressZip()" 或者"findByUserAddress_Zip()"。(强烈建议:无论是否存在混淆,都要在不同类层级之间加上"_" ,增加代码可读性)

1.4.3      一些情况

1.      当查询条件为null时

举例说明如下:

实体定义:对于一个客户实体Cus,包含有name和sex,均是String类型。

查询方法定义:List<Cus>findByNameAndSex(String name,String sex);

使用时:dao.findByNameAndSex(null,"男");

后台生成sql片断:where(cus0_.name is null) and cus0_.sex=?

结论:当查询时传值是null时,数据库中只有该字段是null的记录才符合条件,并不是说忽略这个条件。也就是说,这种查询方式,只适合于明确查询条件必须传的业务,对于动态查询(条件多少是动态的,例如一般的查询列表,由最终用户使用时决定输入那些查询条件),这种简单查询是不能满足要求的。

2.      排序

List<Cus>findBySexOrderByName(String sex); //名称正序(正序时,推荐此方式,简单)

List<Cus>findBySexOrderByNameAsc(String sex); //名称正序(效果同上)

List<Cus>findBySexOrderByNameDesc(String sex); //名称倒序

3.      结果限制

/**

* 根据父ID,得到排序号最大的bo。

* 用于预计算新资源的排序号。

*/

Resource findFirstByFather_idOrderByOrderNumDesc(Long fatherId);

User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname,Pageable pageable);

Slice<User> findTop3ByLastname(String lastname,Pageable pageable);

List<User> findFirst10ByLastname(String lastname,Sort sort);

List<User> findTop10ByLastname(String lastname,Pageable pageable);

4.      计数

Long countByLastname(String lastname);

5.      删除

voiddeleteByProject_Id(Long id);

voiddeleteByProject_Cus_id(Long id);

http://www.cnblogs.com/rulian/p/6434631.html

SpringData JPA 接口和方法的更多相关文章

  1. SpringData JPA接口总结

    1 JPA 1.1 整体概念 JPA:Java Persistence API,就是java持久化api,是SUN公司推出的一套基于ORM的规范. ORM呢:Object-Relational Map ...

  2. Springboot集成SpringData JPA

    序 StringData JPA 是微服务框架下一款ORM框架,在微服务体系架构下,数据持久化框架,主要为SpringData JPA及Mybatis两种,这两者的具体比较,本文不做阐述,本文只简单阐 ...

  3. SpringData JPA详解

    Spring Data JPA 1.    概述 Spring JPA通过为用户统一创建和销毁EntityManager,进行事务管理,简化JPA的配置等使用户的开发更加简便. Spring Data ...

  4. Spring、SpringMVC、SpringData + JPA 整合详解

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7759874.html ------------------------------------ ...

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

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

  6. 6.4 SpringData JPA的使用

    引言:该文档是参考尚硅谷的关于springboot教学视屏后整理而来.当然后面还加入了一些自己从网上收集整理而来的案例! 一.SpringData JPA初步使用 1. springdata简介 2. ...

  7. 一篇 SpringData+JPA 总结

    概述 SpringData,Spring 的一个子项目,用于简化数据库访问,支持 NoSQL 和关系数据库存储 SpringData 项目所支持 NoSQL 存储 MongDB(文档数据库) Neo4 ...

  8. SpringBoot整合SpringData JPA入门到入坟

    首先创建一个SpringBoot项目,目录结构如下: 在pom.xml中添加jpa依赖,其它所需依赖自行添加 <dependency> <groupId>org.springf ...

  9. SpringData JPA复合主键

    上一篇博客简单介绍了SpringData JPA实现简单的CRUD,分页与多条件的排序,那里的主键类型是Long,有时我们会遇到主键不是一个的,复合主键,经过调研如下.确定一个人,不能只根据他的姓名来 ...

随机推荐

  1. puremvc源码阅读

    1.mediator作为ui管理器,是设计成可以list多个notification 2.所有ui想要监听notification,都需要register到facade中 3.puremvc只负责消息 ...

  2. BZOJ5301: [Cqoi2018]异或序列(莫队)

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 400  Solved: 291[Submit][Status ...

  3. Docker学习(三)docker容器操作

    上一篇:Docker学习(二)docker镜像操作 容器是基于镜像创建的,说白了把一个镜像运行起来就是容器 查看容器 docker ps 上面什么也没有,因为我们没有正在运行的容器,下面我门启动一个容 ...

  4. DVD项目

    package sy.com.cn;import java.util.*; public class DvdWorker { public static void main(String[]args) ...

  5. asp.net core microservices 架构之 分布式自动计算(一)

       一:简介   自动计算都是常驻内存的,没有人机交互.我们经常用到的就是console job和sql job了.sqljob有自己的宿主,与数据库产品有很关联,暂时不提.console job使 ...

  6. jQuery 异步和同步请求

    在jQuery Ajax里面有一个async 参数 , 默认值 为true , 请求为异步请求 , false 为同步请求 .. 使用ajax加载数据返回页面并赋值,然后前端取出该值 这其中涉及到代码 ...

  7. java nio和bio

    理解同步/异步,阻塞/非阻塞:https://juejin.im/entry/598da7d16fb9a03c42431ed3 2:http://qindongliang.iteye.com/blog ...

  8. php查询mysql数据库 查询条件替中文字符串变量时无法查询

    $temp2 ='十年';mysql_query("SET NAMES GBK"); $res = mysql_query("select songer_name fro ...

  9. (转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案

    最近做通讯录的项目,需要实时监听短信的删除,就用到了观察者ContentObserver,怪异的事情就此发生,当我删除一条短信的时候,可以监听到,但是,当我删除整条短信的时候,就无法监听到,查了很多资 ...

  10. Python学习总结之一 -- 基础篇

    Python学习第一篇 一:写在前面 啊,最近我的新博客一直都没有更新学习内容了,只是最近一直都在忙着寻找实习机会(或许这只是一个借口,真实原因是我太懒惰了,改改改!).终于今天又投递了几个新的实习职 ...