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. C#与sqlserver开发问题

    最近不停的在考虑C#读取数据性能问题第一种使用ado拼接sql连接数据库第二种使用ado调用存储过程第三种使用entityframework加linq第四种使用反射IList<T> 1.从 ...

  2. 十天学会单片机Day6 学会看数据手册 (IIC总线PCF859芯片( A/D D/A)应用)

    1.实际电路 2.引脚图 3.地址 高四位为固定地址1001,A2A1A0可编程地址,通过观察实际电路,可知A2A1A0 为000.最低位为读写为,1为读,0为写. 4.控制字 控制寄存器的高半字节用 ...

  3. BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur 【tarjan】【DP】*

    BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur Description In an effort to better manage the grazing pat ...

  4. BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*

    BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...

  5. 【DUBBO】dubbo的LoadBalance接口

    LoadBalance负载均衡, 负责从多个 Invokers中选出具体的一个Invoker用于本次调用,调用过程中包含了负载均衡的算法,调用失败后需要重新选择 --->类注解@SPI说明可以基 ...

  6. hdu 1724 Ellipse——辛普森积分

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1724 #include<cstdio> #include<cstring> #in ...

  7. JavaSE 手写 Web 服务器(一)

    原文地址:JavaSE 手写 Web 服务器(一) 博客地址:http://www.extlight.com 一.背景 某日,在 Java 技术群中看到网友讨论 tomcat 容器相关内容,然后想到自 ...

  8. LNMP.ORG 安装LNMP

    参考:http://lnmp.org/install.html cd /usr/local/src wget -c http://soft.vpser.net/lnmp/lnmp1.3-full.ta ...

  9. 总结css的使用技巧

    1. 纯 CSS 的 tooltips 现在的要求是使用纯css在页面上显示一个title,或者图片的描述文字(在鼠标移入图片之后): content,attr() content一般与::befor ...

  10. 转发,重定向以及区别和简单的session对象

    1.转发     作用:在多个页面交互过程中实现请求数据的共享.     过程:Web服务器内部将一个request请求的处理权交给另外一个资源,属于同一个访问请求和响应过程,所以request对象的 ...