简单查询--接口方法
五个接口详解
其中T是要操作的实体类,ID是实体类主键的类型。该接口提供了11个常用操作方法。
save(Iterableentities);//批量保存
TfindOne(IDi;//根据id查询一个对象。返回对象本身,当对象不存在时,返回null
Iterable
Iterable
booleanexists(IDi;//根据id判断对象是否存在
longcount();//计算对象的总个数
voiddelete(IDi;//根据id删除
voiddelete(Tentity);//删除一个对象
voiddelete(Iterableentities);//批量删除,集合对象
voiddeleteAll();//删除所有
}
该接口继承了CrudRepository接口,提供了两个方法,实现了分页和排序的功能了。
publicinterfacePagingAndSortingRepository
Iterable
Page
}
该接口继承了PagingAndSortingRepository接口。
同时也继承QueryByExampleExecutor接口,这是个用“实例”进行查询的接口,后续再写文章详细说明。
List
List
List
voidflush();//强制缓存与数据库同步
save(Iterableentities);//批量保存,并返回对象List
voiddeleteInBatch(Iterable
voiddeleteAllInBatch();//删除所有
TgetOne(IDi;//根据id查询一个对象,返回对象的引用。当对象不存时,返回引用不是null,但各个属性值是null
findAll(Exampleexampl;//根据实例查询
findAll(Exampleexample,Sortsort);//根据实例查询,并排序。
}
几点说明:
几个查询、及批量保存方法,和CrudRepository接口相比,返回的是List,使用起来更方便。
增加了InBatch删除,实际执行时,后台生成一条sql语句,效率更高些。相比较而言,CrudRepository接口的删除方法,都是一条一条删除的,即便是deleteAll也是一条一条删除的。
增加了getOne()方法,切记,该方法返回的是对象引用,当查询的对象不存在时,它的值不是Null。
该接口提供了对JPACriteria查询的支持。这个接口很有用,具体不粘源码了。
方法定义规则
符号 | 含义 |
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 | 忽略大小写 |
解析方法名--规则说明
规则描述
按照Springdata定义的规则,查询方法以find|read|get开头,涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。
如果方法的最后一个参数是Sort或者Pageable类型,也会提取相关的信息,以便按规则进行排序或者分页查询。
举例说明
比如findByUserAddressZip()。框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,详细规则如下:
先判断userAddressZip是否为AccountInfo的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
从右往左截取第一个大写字母开头的字符串,然后检查剩下的字符串是否为AccountInfo的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设user为AccountInfo的一个属性;
接着处理剩下部分,先判断user所对应的类型是否有addressZip属性,如果有,则表示该方法最终是根据'AccountInfo.user.addressZip'的取值进行查询;否则继续按照步骤2的规则从右往左截取,最终表示根据'AccountInfo.user.address.zip'的值进行查询。
可能会存在一种特殊情况,比如AccountInfo包含一个user的属性,也有一个userAddress属性,此时会存在混淆。读者可以明确在属性之间加上'_'以显式表达意,比如'findByUser_AddressZip()'或者'findByUserAddress_Zip()'。
一些情况
当查询条件为null时
举例说明如下:
实体定义:对于一个客户实体Cus,包含有name和sex,均是String类型。
查询方法定义:List
使用时:dao.findByNameAndSex(null,'男');
后台生成sql片断:where(cus0_.nameisnulandcus0_.sex=?
结论:当查询时传值是null时,数据库中只有该字段是null的记录才符合条件,并不是说忽略这个条件。也就是说,这种查询方式,只适合于明确查询条件必须传的业务,对于动态查询,这种简单查询是不能满足要求的。
排序
List
List
结果限制
/**
*根据父ID,得到排序号最大的bo。
*用于预计算新资源的排序号。
*/
计数
删除
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点