zoukankan      html  css  js  c++  java
  • 关于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的货物列表,并且按升序排列

  • 相关阅读:
    文件I/O(二)
    linux学习之文件I/O篇(一)
    静态库和共享库
    vim-ide
    CentOS6 vsftpd 安装及优化方法
    Redmine2.5+CentOS6+Apache2
    分享一个TP5实现Create()方法的心得
    Windows证书的生成导出以及使用证书验证文件是否被修改
    如何设置程序UAC控制
    关于C#的可变长参数
  • 原文地址:https://www.cnblogs.com/xuyuanjia/p/5795621.html
Copyright © 2011-2022 走看看