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)@Idpublic 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)@Idpublic 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的货物列表,并且按升序排列

转载于:https://www.cnblogs.com/xuyuanjia/p/5795621.html

关于JPA方法名创建自动查询相关推荐

  1. SpringBoot使用SpringDataJPA通过方法名查询

    文章目录 JPA方法名查询 1. 方法名表图 2. 举例说明 3. 测试 JPA依赖及配置在这篇文章: SpringBoot框架使用SpringDataJPA JPA方法名查询 约定方法名一定要根据命 ...

  2. Spring Data JPA 从入门到精通~查询方法的创建

    查询方法的创建 内部基础架构中有个根据方法名的查询生成器机制,对于在存储库的实体上构建约束查询很有用,该机制方法的前缀 find-By.read-By.query-By.count-By 和 get- ...

  3. 006_Spring Data JPA基于方法名称命名规则查询

    1. Repository接口 1.1. Repository接口是Spring Data JPA中为我我们提供的所有接口中的顶层接口. 1.2. Repository提供了两种查询方式的支持 1.2 ...

  4. Spring Data JPA使用必备(二):Spring Data JPA方法命名规则实现SQL自动生成

    Spring data JPA是一个好东西,但是对于很多习惯于写SQL,直接怼数据库的人来说,这个真的用不习惯,还被一致认为是一个不易于程序员发展的技术.因为JPA提供了标准的封装,在操作数据库的时候 ...

  5. JpaRepository查询方法名规范

    JpaRepository的查询 直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:JpaRepository会对方法名进行校验 不符合规范会报错 除非添加@Que ...

  6. 【SQL数据库】数据库的创建、查询、插入等操作使用方法(结合黑皮书教材网站(db-book中的例子)在MySQL Workbench和shell中实现查询操作

    SQL 数据库的创建.查询.插入等操作使用方法(结合黑皮书教材网站中的例子) 注:数据来源: https://www.db-book.com/university-lab-dir/sample_tab ...

  7. 创建简单的银行账户类,包括开户人、账号、和存款余额3个属性,以及查询余额、存款、取款等方法。创建两个账户验证类的设计。

    创建简单的银行账户类,包括开户人.账号.和存款余额3个属性,以及查询余额.存款.取款等方法.创建两个账户验证类的设计. 完整代码如下: package pk1; import java.util.Sc ...

  8. 【Spring Data JPA自学笔记三】Spring Data JPA的基础和高级查询方法

    文章目录 调用接口的基础方法查询 Repository CrudRepository PagingAndSortingRepository JPARepository JpaSpecification ...

  9. Python编程语言学习:python语言中快速查询python自带模块函数的用法及其属性方法、如何查询某个函数关键词的用法、输出一个类或者实例化对象的所有属性和方法名之详细攻略

    Python编程语言学习:python语言中快速查询python自带模块&函数的用法及其属性方法.如何查询某个函数&关键词的用法.输出一个类或者实例化对象的所有属性和方法名之详细攻略 ...

最新文章

  1. cmenu 隐藏子项中的一个子项_区分Maven中dependencyManagement与dependencies的作用
  2. 32位汇编语言条件伪指令和win32汇编关于windows.inc的error A2004
  3. mock 测试 MVC
  4. react登录页面_React 实现路由拦截
  5. 使用tr1的bind函数模板
  6. 寄宿于CS程序的WCF服务
  7. 360浏览器打不开qq空间_360浏览器打不开? 60浏览器打不开网页的处理方法(图文)...
  8. 浅谈安卓Xutils框架(一)
  9. JanusGraph 数据模型
  10. 同问 集成网卡和独立网卡哪个好?
  11. semilogx 多条曲线_如何在excel中绘制多条曲线
  12. 业务分析报告与数据可视化报表
  13. display 常用属性
  14. chrome浏览器启动页被篡改为360导航
  15. 物联网云平台将成为产业生态的核心
  16. 计算机未连接到网络,电脑未连接到一个互联网的问题,解决网络问题方法
  17. 【C语言中“%d %%d %%%d“代表的意思】
  18. 微信公众号的开发:基于Java版本的服务器(1)
  19. Oracle 无备份情况恢复ocr和olr
  20. 逃不开的安迪-比尔定律,在智能机器人时代该如何破解?

热门文章

  1. 计算机网络实验报告校园网,校园网规划与设计实验报告.docx
  2. linux的备份命令及其参数,linux cpio命令参数及用法详解--linux备份文件命令
  3. android 刷新view位置,Android View刷新机制实例分析
  4. MySQL8怎么设置时区为东八区_mysql时区设置为东八区
  5. 使用权值衰减算法解决神经网络过拟合问题、python实现
  6. pythoni手机版下载_Python进度栏和下载
  7. cadence设计运算放大器_21.比较器的原理与特性,它与运算放大器的本质区别总结归纳...
  8. c语言5版第10章答案,第10章 指 针 参考答案 c语言(1)
  9. 基于Echarts+HTML5可视化数据大屏展示—大数据管理平台中心
  10. java 一对一的关系_与休眠一对一关系 - java