关于JPA方法名创建自动查询
JPA 的根据解析方法名称自动对接口进行实现的方法能节省大量的资源,以下对于解析规则进行列举哈
商品实体类
package com.dionren.zhaoxie.entity.trade; import com.dionren.mvc.entity.EntityBase;
import com.dionren.zhaoxie.entity.EntityShoeSku;
import io.swagger.annotations.ApiModelProperty; import javax.persistence.*;
import java.math.BigDecimal; /**
*
* 单件货物,即SKU+鞋码+数量,单件货物不能单独存在,只能依附到配货单、订单、生产单中
*
* 本类是单件货物的基类,单表继承方式,即所有子类数据都存到一个表中,通过goodsType来区分
*
*/ @Entity
@Table(name = "trade_goods")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "goodsType", discriminatorType = DiscriminatorType.STRING)
public class EntityTradeGoods extends EntityBase {
@GeneratedValue(strategy= GenerationType.AUTO)
@Id
public Long id; // 序列ID @ApiModelProperty(value = "SKU的ID号")
@ManyToOne(cascade = {CascadeType.REFRESH},fetch = FetchType.EAGER)
@JoinColumn(name = "skuId")
public EntityShoeSku sku; @ApiModelProperty(value = "进货价")
@Column(precision=18, scale=2)
public BigDecimal priceIn;
// public Double priceIn; @ApiModelProperty(value = "销售价")
@Column(precision=18, scale=2)
public BigDecimal priceOut;
// public Double priceOut; @ApiModelProperty(value = "尺码,按照mm标注")
public Integer size; @ApiModelProperty(value = "订货数量")
public Integer quantity; }
鞋子的SKU类
package com.dionren.zhaoxie.entity; import com.dionren.mvc.api.ApiJsonView;
import com.dionren.mvc.entity.EntityBase;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonView;
import io.swagger.annotations.ApiModelProperty; import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date; /**
* Created by DionRen on 2015/9/28.
*
* 鞋样的数据
*/ @Entity
@Table(name = "shoe_sku")
public class EntityShoeSku extends EntityBase { @JsonView(ApiJsonView.ListSummary.class)
@GeneratedValue(strategy= GenerationType.AUTO)
@Id
public Long id; // 序列ID @ApiModelProperty("款型的id")
public Long shoePatternId; @ApiModelProperty("sku完整编码")
@Column(length = 32)
public String skuCode; @ApiModelProperty(value = "sku编码的后两位")
@Column(length = 2)
public String colorCode; @ApiModelProperty(value = "颜色的中文名称")
@Column(length = 64)
public String colorName; @ApiModelProperty("sku所属的企业id,其实可以从patternId查询,但是为了加速查询")
public Long clientCompanyId; }
方法解析:(findByPriceOutAndSkuSkuCode)
1.首先去掉前缀,如find、findBy、read、readBy、get、getBy,剩下部分进行解析。并且如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。
2.经过第一步,方法名剩下PriceOutAndSkuSkuCode,先判断 PriceOut(根据 POJO 规范,首字母变为小写,下同)是否为 PriceOut的一个属性,
3.1如果是对象的一个属性,并且遇到and,则将其作为查询条件中的一个继续步骤2,判断SkuSkuCode
3.2如果不是对象的一个属性遇到And,则报错:对象中没有对应的属性,And算是强制拆分。
3.3.如果是,并且也没有遇到and,则以将此属性作为对象,继续向下判断,既把SKU作为一个对象,向下找sku的属性
如上述:方法findByPriceOutAndSkuSkuCode就会拆分成根据priceOut和 sku.skuCode查询,
下面举例理解下上述:
findByPriceIn---->根据priceIn查询
findByPriceInAndPriceOut---->根据priceIn和PriceOut查询
findByPriceInAndSkuSkuCode--->根据priceIn丶skuid与sku表主键关联后sku表的skuCode查询
findByPriceInSkuSkuCode------>报错,会把priceIn作为一个对象根据priceIn的sku属性查询
正确应该为findByPriceInAndSkuSkuCode
findBySkuSkuCodeColorCode --->报错会议sku.skuCode.colorCode查询,
正确应该为findBySkuSkuCodeAndSkuColorCode
可能会存在一种特殊情况,比如 AccountInfo 包含一个 user 的属性,也有一个 userAddress 属性,此时会存在混淆。读者可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_AddressZip()" 或者 "findByUserAddress_Zip()"。
在查询时,通常需要同时根据多个属性进行查询,且查询的条件也格式各样(大于某个值、在某个范围等等),Spring Data JPA 为此提供了一些表达条件查询的关键字,大致如下:
- And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);
 - Or --- 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);
 - Between --- 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min);
 - LessThan --- 等价于 SQL 中的 "<",比如 findBySalaryLessThan(int max);
 - GreaterThan --- 等价于 SQL 中的">",比如 findBySalaryGreaterThan(int min);
 - IsNull --- 等价于 SQL 中的 "is null",比如 findByUsernameIsNull();
 - IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByUsernameIsNotNull();
 - NotNull --- 与 IsNotNull 等价;
 - Like --- 等价于 SQL 中的 "like",比如 findByUsernameLike(String user);
 - NotLike --- 等价于 SQL 中的 "not like",比如 findByUsernameNotLike(String user);
 - OrderBy --- 等价于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user);
 - Not --- 等价于 SQL 中的 "! =",比如 findByUsernameNot(String user);
 - In --- 等价于 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
 - NotIn --- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
 
以上与方法解析可以合并用:
举例
findBySkuSkuCodeAndPriceInLessThanOrderOrderByPriceInAsc("10123",200);
查询所有Sku的skuCode等于10123,priceIn小于200的货物列表,并且按升序排列
关于JPA方法名创建自动查询的更多相关文章
- 【tmos】spring data jpa 创建方法名进行简单查询
		
参考链接 spring data jpa 创建方法名进行简单查询:http://www.cnblogs.com/toSeeMyDream/p/6170790.html
 - spring data jpa 创建方法名进行简单查询
		
版权声明:本文为博主原创文章,未经博主允许不得转载. spring data jpa 可以通过在接口中按照规定语法创建一个方法进行查询,spring data jpa 基础接口中,如CrudRepos ...
 - 为已有表快速创建自动分区和Long类型like 的方法-Oracle 11G
		
对上一篇文章进行实际的运用.在工作中遇到有一张大表(五千万条数据),在开始的时候忘记了创建自动分区,导致现在使用非常不方便,查询的速度非常的满,所以就准备重新的分区表,最原始方法是先创建新的分区表,然 ...
 - SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法
		
软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...
 - M-Renamer方法名修改器,iOS项目方法名重构,Objective-C/Swift,代码模型预判,减少误改的机率,替换速度更快,可视化操作,傻瓜式操作,一键操作,引用处自动修改,马甲包的福音
		
M-Renamer M-Renamer(Method-Name-Renamer)类方法名修改器,采用链式解析头文件,代码模型预判,减少误改的机率,替换速度更快:可以解析整个项目大多数类的方法,可视化操 ...
 - 004-spring-data-elasticsearch 3.0.0.0使用【二】-spring-data之定义方法、创建repository实例、从聚合根发布事件
		
续上文 1.4.定义方法 存储库代理有两种方法可以从方法名称派生特定于存储的查询.它可以直接从方法名称派生查询,或者使用手动定义的查询.可用选项取决于实际store.但是,必须有一个策略来决定创建什么 ...
 - JPA的多表复杂查询
		
转 JPA的多表复杂查询:详细篇 原文链接: https://mp.weixin.qq.com/s/7J6ANppuiZJccIVN-h0T3Q 2017-11-10 从小爱喝AD钙 最近工作中由于 ...
 - ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法   ,聚合,分组,F查询,Q查询,事务 )
		
必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...
 - Spring Boot Jpa 表名小写转大写
		
今天在使用SpringBoot整合Hibernate后创建表,表名为小写,而在linux下,mysql的表名是区分大小写的,因此在我的数据表中,就出现了两个一样的表 act_id_user 和 AC ...
 
随机推荐
- springMVC+JAP整合彻底摆脱persistence.xml配置文件
			
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
 - <!DOCTYPE> 标签的深度剖析以及使用选择
			
前言: 今天被问道“有没有仔细了解过<!DOCTYPE>标签?”,愣了一下,因为一开始在W3cschool上看到过建议使用XHTML Transitional DTD,之后就很听话地把Dr ...
 - spring 切面 前置后置通知 环绕通知demo
			
环绕通知: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...
 - HTML第二天学习笔记
			
今天看视频学习的第一个知识是HTML中的块元素<div>和行内元素<span>. <!doctype html> <html lang="en&qu ...
 - DLL文件无法删除怎么解决
			
dll文件你听说过吗?那怎样把那些删不掉的东西删掉呢?请看.... 老听网友说某某文件删不掉啊.之类的.而且有很多都是dll文件.删除的时候总是提示,"正在使用"或者是" ...
 - SVN备份批处理文件
			
SVN备份批处理文件,亲测可用 另外,备份文件时获取文件名%%~ni 可改为%%~nxi,以避免文件名中有“.”号时,读取不完成,将.后面的当作后缀名 需要使用hotcopy 时,可以将关键代码进行相 ...
 - ibatis基本内容简介
			
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2002年发起的开放源代码项目.于2010年6月16号被 谷歌托管,改名为MyBatis.是一个 ...
 - 【JS】识别浏览器版本及操作平台
			
背景: 有这么个需求,需要统计,用户打开网站使用的浏览器,以及操作平台. 实现: 受HTML5Test这个网站的影响,发现它可以实现,获取浏览器以及平台的功能,然后研究代码发现了这个 ...
 - 使用jQuery Mobile和Phone Gap开发Android应用程序
			
经过了一段时间的学习,初步了解了该如何使用jQuery Mobile和 Phone Gap来开发一个Android应用程序,也想把这些东西介绍给大家. 1. 软件准备 要进行android app的开 ...
 - 大话数据结构—平衡二叉树(AVL树)
			
平衡二叉树(Self-Balancing Binary Search Tree/Height-Balanced Binary Search Tree),是一种二叉排序树,当中每个节点的左子树和右子树的 ...