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. POJ3682King Arthur's Birthday Celebration(数学期望||概率DP)

    King Arthur is an narcissist who intends to spare no coins to celebrate his coming K-th birthday. Th ...

  2. Hbase rowkey热点问题

    当处理由连续事件得到的数据时,即时间上连续的数据.这些数据可能来自于某个传感器网络.证券交易或者一个监控系统.它们显著的特点就是rowkey中含有事件发生时间.带来的一个问题便是HBase对于row的 ...

  3. vmware linux nat模式设置静态ip

    网上资料很多,但是都不怎么实用,这里给大家总结一下.nat模式上网.因为nat本身就能上网为什么还要设置ip.这有点自找麻烦.但是在集群这是必须的.要么你搭建伪分布,要么至少具有三台物理机器.为了节省 ...

  4. Tornado的入门研究

    1.为啥要了解Tornado 首先,Tornado是大神写出来的,如果学习python的话,参照Tornado的源码是一件非常好的事情,属于FaceBook的开源代码 其次,Tornado就是我们在 ...

  5. Spring Cloud feign 服务超时处理

    Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fa ...

  6. Mybatis逆向工程配置文件详细介绍(转)

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...

  7. openOffice转换的时候乱码在linux下使用openOffice的时候发现在转换后出现了乱码

    openOffice转换的时候乱码 在linux下使用openOffice的时候发现在转换后出现了乱码,最后上网查了一下,按照网上的说法去试了试,最后也没有解决,也可能是我这边的linux的权限问题, ...

  8. 分享百度文件上传组件webUploader的使用demo

    先创建DOM节点:<head ng-app="myApp"> <meta charset="UTF-8"> <title>& ...

  9. 使用php生成数字、字母组合验证码(一)

    项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略.实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码: 所用语言php,gd库 原理解释: a>实质上是在 ...

  10. caffe读取多标签的lmdb数据

    问题描述: lmdb文件支持数据+标签的形式,但是却只能写入一个标签,引入多标签的解决方法有很多,这儿详细说一下我的办法:制作多个data数据,分别加入一个标签.我的方法只适用于标签数量较少的情况,标 ...