自定义sql

1.基本功能 1.基本功能

1.1.自定义SQL 1.1.自定义SQL

  1. 自定义SQL是一条查询语句,与视图不同,没有CREATE OR REPLACE VIEW XXX AS语法,推荐使用自定义SQL,性能更优。用户编写自定义SQL语句,常规的手写Mapper.xml中,【<select id=”selectByExample”】底下包含了各种关联条件,自定义动态查询条件写法一般为:
<if test="dyncComplexCriteria!=null and dyncComplexCriteria.criteria!=null" >
          <foreach collection="dyncComplexCriteria.criteria" item="criertion">
                  <if test="criterion!=null and criterion.columnName='CARGO_NO'" >
                        and ${_parameter.parsing(criterion,'')} 
                  </if>
                 <if test="criterion!=null and criterion.columnName='HS_CODE'" >
                        and ${_parameter.parsing(criterion,'')} 
                  </if>
          </foreach>
</if>

h083101

left join MF_ORDER mo on mo.mf_order_id = co.source_order_id
<if test='dyncComplexCriteria!=null ' and dyncComplexCriteria.criteria!=null>
         <foreach collection="dyncComplexCriteria.criteria" item="criertion">
          <if test="criterion!=null and criterion.columnName='SALES_CODE'" >
                          and ${_parameter.parsing(criterion,''mo)} 
         </if>
        </foreach>
</if>

h083102
2. 自定义SQL目标支持解析三种标识符,用户可指定标识符,使得云平台自动生成的Mapper中包含以下内容:
2.1. #[]:动态查询条件字段集,内部存放动态查询条件字段。
结构:#[ 连接符 字段A 连接符 字段B]
例:#[ and ${CARGO_NO} and ${HS_CODE}]
#[ and ${mo.SALES_CODE}]
2.2. ${}:动态查询条件字段名称,存放在 #[] 动态查询条件字段集中
结构: ${表别名.字段名}
例:${CARGO_NO}
${mo.SALES_CODE}
2.3. @{}:完整查询条件,如若默认生成的动态查询条件模板不符合用户需求,用户可通过该标识符,手动指定查询条件
结构:@{查询条件}
例子:@{&lt;#if test=”criterion!=null and criterion.columnName=”SALES_CODE”&gt;and ${_parmater.parsing(criterion, “mo”)}&lt;/#if&gt;}
3. 根据上述云平台提供的三种标识符,我们可以简单自定义一条自定义SQL语句:
h083103

1.2.自定义sql(去外层查询)1.2. 自定义sql(去外层查询)

平台生成查询语句按照自定义写的sql生成,where后面的条件则是根据界面输入的条件动态拼接的。

2. 配置方法 2. 配置方法

目前云平台解析自定义SQL代码支持仍未全面。如若自定义语句中包含字段嵌套子查询等相对复杂的SQL语句,可能出现无法正确解析出相关字段的格式和内容。需要用户手写指定该字段详细信息。

2.1. 自定义SQL 2.1. 自定义SQL

配置

  1. 数据建模–数据结构–视图定义,单击【新增】按钮,新增自定义SQL语句创建视图名称,视图类型选择为自定义SQL,新增视图创建语句中填写sql用户编写的SQL语句。
    h083104
  2. 保存并创建完毕后,点击【同步字段】,云平台解析SQL语句字段内容。
    h083105
  3. 指定主键字段并保存。
    h083106
  4. 对象建模–业务对象–业务对象管理:创建业务对象,引入创建的自定义SQL视图
    h083107
  5. 同步数据结构,然后编辑业务对象,按需求增加页面列表。
    h083108
  6. 保存业务对象数据,提交并生成代码。

代码

mapper文件上的方法

from (select s.ipf_ccm_log_table_id,s.table_name,t.field_name,t.field_desc from ipf_ccm_log_table s
left join ipf_ccm_log_table_field t
on t.ipf_ccm_log_table_id=s.ipf_ccm_log_table_id where 1=1
<if test ="dyncComplexCriteria!=null and dyncComplexCriteria.criteria!=null">
    <foreach collection="dyncComplexCriteria.criteria" item="criterion">
         <if test="criterion!=null and criterion.columnName=='table_name'">
             and ${_parameter.parsing(criterion,'s')}
         </if>
     <if test="criterion!=null and criterion.columnName=='field_desc'">
             and ${_parameter.parsing(criterion,'t')}
         </if>
     </foreach>
</if>

h083109

2.2.自定义sql(去外层查询) 2.2.自定义sql(去外层查询)

  • sql语句结束中不需要加入分号【;】。
  • 第一层中的查询语句不能写where后面的条件例如order by,group by等;如果是子查询则支持。
  • 如果查询结果集中需要显示两张表中的相同字段,则其中一个字段名需要取别名。

  • 自定义sql-配置2

    配置

    1. 项目管理–项目初始化–视图级配置,点击新增记录,进入新增页。配置项类型为【自定义SQL去条件】,配置内容为【Y】。返回视图级配置页面,勾选新增的记录然后点击【批量提交】按钮提交。
      自定义sql-配置4
    2. 数据建模–数据结构–视图定义,单击【新增】按钮跳转新增界面进行维护对应的数据。视图名称格式【大写字母+下划线】,视图描述自定义,视图类型选择【自定义SQL】,然后保存数据。选择子页签【视图创建语句】,点击新增进入新增界面。挑选数据库类型【MySql】,大文本中填写查询的sql语句。
      自定义sql-配置1
    3. 保存数据后回到视图定义界面,选择刚才的记录,点击【同步字段】按钮。
      QQ截图20191104150411
    4. 如果有取别名情况存在,此时需要编辑视图定义,选择刚才提示的字段,编辑进去,然后填写对应的表别名和物理字段。
      自定义sql-配置3

    代码

    mapper文件上的方法

    <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.gillion.sample.lixq.domain.VwTestLixq201Example" >
        <include refid="OraclePaginationPrefix" />
        select
       tld.ASN_DETAIL_NO,
       tld.PUTAWAY_QTY,
       tld.creator,
       tld.test_exma_lixq_201_detail_id,
       tld.create_time,
       tl.RECEIVE_PERSON_NAME,
       tl.RECEIPT_METHOD,
       tl.RECEIPT_DESC,
       tl.RECEIPT_MODEL,
       tl.creator as creator_tl,
       tl.create_time as create_time_tl,
       tl.test_exam_lixq_201_id,
      ,tl.remark
    from  TEST_EXAM_201_DETAIL_LIXQ tld
    left join test_exam_201_lixq tl
    on test_exam_lixq_201_id - tl.test_exam_lixq_201_id
     <if test="_parameter != null" >
          <include refid="Example_Where_Clause" />
        </if>
        <if test="orderByClause != null and orderByClause != ''" >
          order by ${orderByClause}
        </if>
     <include refid="OraclePaginationSuffix" />
      </select>
    

    example文件上的变化,里面有表别名和物理字段

    public VwTestLixq201Example()
        {
            super();
            this.isDyncComplex = true;
            mapColumns = Maps.newHashMap();
            mapColumns.put("#_PROPERTY_#","X");
            mapColumns.put("creatTime","TLD");
            mapColumns.put("createTimeTl","TL.CREATE_TIME");
            mapColumns.put("creatorTl","TL.CREATOR");
            mapColumns.put("testExamLixq201DetailId","TLD");
            mapColumns.put("receiptModel","TL");
            mapColumns.put("receiptMethod","TL");
            mapColumns.put("putawayQty","TLD");
            mapColumns.put("asnDetailNo","TLD");
            mapColumns.put("testExamLixq201Id","TL");
            mapColumns.put("creator","TLD");
            mapColumns.put("receivePersonName","TL");
            mapColumns.put("receiptOrderNo","TLD");
            mapColumns.put("receiptDesc","TL");
    
        }
    
    

    3.常用扩展3.常用扩展

    4. 版本更新 4. 版本更新

    7.4.1,2021.03.12

    优化

  • 视图定义【同步字段】按钮导入的字段的数据元素编码匹配时候需要过滤引用的数据元素。
  • 5.5.0,2019.05.10

    优化

  • 自定义sql则是存在外层嵌套的查询,效果图如下,且这个版本不存在别名问题,且是可以配置where后面的查询语句的,也不需要配置视图级配置项。
  • 去外层select版本需需要在5.5.0.+版本,涉及到模板和jar包的改动, 该版本目前仅支持MySql数据库。