1.基本功能 1.基本功能
1.1.自定义SQL 1.1.自定义SQL
- 自定义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>
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>
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. @{}
:完整查询条件,如若默认生成的动态查询条件模板不符合用户需求,用户可通过该标识符,手动指定查询条件
结构:@{查询条件}
例子:@{<#if test=”criterion!=null and criterion.columnName=”SALES_CODE”>and ${_parmater.parsing(criterion, “mo”)}</#if>}
3. 根据上述云平台提供的三种标识符,我们可以简单自定义一条自定义SQL语句:
1.2.自定义sql(去外层查询)1.2. 自定义sql(去外层查询)
平台生成查询语句按照自定义写的sql生成,where后面的条件则是根据界面输入的条件动态拼接的。
2. 配置方法 2. 配置方法
目前云平台解析自定义SQL代码支持仍未全面。如若自定义语句中包含字段嵌套子查询等相对复杂的SQL语句,可能出现无法正确解析出相关字段的格式和内容。需要用户手写指定该字段详细信息。
2.1. 自定义SQL 2.1. 自定义SQL
配置
- 数据建模–数据结构–视图定义,单击【新增】按钮,新增自定义SQL语句创建视图名称,视图类型选择为自定义SQL,新增视图创建语句中填写sql用户编写的SQL语句。
- 保存并创建完毕后,点击【同步字段】,云平台解析SQL语句字段内容。
- 指定主键字段并保存。
- 对象建模–业务对象–业务对象管理:创建业务对象,引入创建的自定义SQL视图
- 同步数据结构,然后编辑业务对象,按需求增加页面列表。
- 保存业务对象数据,提交并生成代码。
代码
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>
2.2.自定义sql(去外层查询) 2.2.自定义sql(去外层查询)
配置
- 项目管理–项目初始化–视图级配置,点击新增记录,进入新增页。配置项类型为【自定义SQL去条件】,配置内容为【Y】。返回视图级配置页面,勾选新增的记录然后点击【批量提交】按钮提交。
- 数据建模–数据结构–视图定义,单击【新增】按钮跳转新增界面进行维护对应的数据。视图名称格式【大写字母+下划线】,视图描述自定义,视图类型选择【自定义SQL】,然后保存数据。选择子页签【视图创建语句】,点击新增进入新增界面。挑选数据库类型【MySql】,大文本中填写查询的sql语句。
- 保存数据后回到视图定义界面,选择刚才的记录,点击【同步字段】按钮。
- 如果有取别名情况存在,此时需要编辑视图定义,选择刚才提示的字段,编辑进去,然后填写对应的表别名和物理字段。
代码
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");
}