问题描述
我想在后台创建一个报告定义项,以检索一些列。查询需要像这样来检索我需要的内容:
SELECT {a},{b},{c} FROM {model} WHERE {d} IS NULL AND {e} IS NULL
所有值 (a,b...e) 都是字符串。我想参数化 {d} 和 {e} 列,但我希望能够准确搜索我之前编写的查询。 我开始做类似的事情:
SELECT {a},{c} FROM {model} WHERE {d}=?dStatus AND {e}=?eStatus
、dStatus 和 eStatus 参数是 java.lang.String 类型,但这不起作用。
是否可以使用参数化的 {d} 和 {e} 列进行这个灵活的搜索查询,以在报告定义中搜索空值?
解决方法
嗨,如果您想将报告定义参数化,这是可能的。
您可以通过以下步骤来完成。
<itemtype code="testBasicOrderEntryReport" extends="Item" metatype="ViewType"
jaloonly="true" jaloclass="de.hybris.platform.util.ViewResultItem" generate="false">
<description>Basic Order Entry Report</description>
<custom-properties>
<property name="legacyPersistence">
<value>java.lang.Boolean.TRUE</value>
</property>
<property name="query">
<value>
" SELECT "
+ "{BaseStore.name} AS country,"
+ "{Order.code} AS orderCode,"
+ "DATE({Order.date}) AS orderDate,"
+ "{Product.code} AS productCode,"
+ "{OrderEntry.quantity} AS qty,"
+ "{OrderMargin.margin} AS CVR "
+ "FROM { OrderEntry "
+ "JOIN Order ON {OrderEntry.order} = {Order.pk} "
+ "JOIN BaseStore ON {Order.store} = {BaseStore.pk} "
+ "JOIN Product ON {OrderEntry.product} = {Product.pk} "
+ "LEFT JOIN OrderMargin ON {OrderEntry.margin} = {OrderMargin.pk} "
+ "} WHERE "
+ "{Order.store}=?baseStoreParam "
+ "AND "
+ "{Order.date}>=?orderStartDateParam "
+ "AND "
+ "{Order.date}<=?orderEndDateParam "
+ "AND "
+ "{Order.versionID} is null "
</value>
</property>
</custom-properties>
<attributes>
<attribute qualifier="baseStoreParam" type="BaseStore" metatype="ViewAttributeDescriptor">
<persistence type="jalo"/>
<modifiers write="false" search="false" optional="false"/>
<custom-properties>
<property name="param">
<value>Boolean.TRUE</value>
</property>
<property name="position">
<value>Integer.valueOf(0)</value>
</property>
</custom-properties>
</attribute>
<attribute qualifier="orderStartDateParam" type="java.util.Date" metatype="ViewAttributeDescriptor">
<persistence type="jalo"/>
<modifiers write="false" search="false" optional="false"/>
<custom-properties>
<property name="param">
<value>Boolean.TRUE</value>
</property>
<property name="position">
<value>Integer.valueOf(1)</value>
</property>
</custom-properties>
</attribute>
<attribute qualifier="orderEndDateParam" type="java.util.Date" metatype="ViewAttributeDescriptor">
<persistence type="jalo"/>
<modifiers write="false" search="false" optional="false"/>
<custom-properties>
<property name="param">
<value>Boolean.TRUE</value>
</property>
<property name="position">
<value>Integer.valueOf(2)</value>
</property>
</custom-properties>
</attribute>
<attribute qualifier="country" type="java.lang.String" metatype="ViewAttributeDescriptor">
<persistence type="jalo"/>
<modifiers write="false" search="false" optional="false"/>
<custom-properties>
<property name="param">
<value>Boolean.FALSE</value>
</property>
<property name="position">
<value>Integer.valueOf(0)</value>
</property>
</custom-properties>
</attribute>
<attribute qualifier="orderCode" type="java.lang.String" metatype="ViewAttributeDescriptor">
<persistence type="jalo"/>
<modifiers write="false" search="false" optional="false"/>
<custom-properties>
<property name="param">
<value>Boolean.FALSE</value>
</property>
<property name="position">
<value>Integer.valueOf(1)</value>
</property>
</custom-properties>
</attribute>
<attribute qualifier="orderDate" type="java.lang.String" metatype="ViewAttributeDescriptor">
<persistence type="jalo"/>
<modifiers write="false" search="false" optional="false"/>
<custom-properties>
<property name="param">
<value>Boolean.FALSE</value>
</property>
<property name="position">
<value>Integer.valueOf(2)</value>
</property>
</custom-properties>
</attribute>
<attribute qualifier="productCode" type="java.lang.String" metatype="ViewAttributeDescriptor">
<persistence type="jalo"/>
<modifiers write="false" search="false" optional="false"/>
<custom-properties>
<property name="param">
<value>Boolean.FALSE</value>
</property>
<property name="position">
<value>Integer.valueOf(3)</value>
</property>
</custom-properties>
</attribute>
<attribute qualifier="qty" type="java.lang.Integer" metatype="ViewAttributeDescriptor">
<persistence type="jalo"/>
<modifiers write="false" search="false" optional="false"/>
<custom-properties>
<property name="param">
<value>Boolean.FALSE</value>
</property>
<property name="position">
<value>Integer.valueOf(4)</value>
</property>
</custom-properties>
</attribute>
<attribute qualifier="CVR" type="java.lang.Double" metatype="ViewAttributeDescriptor">
<persistence type="jalo"/>
<modifiers write="false" search="false" optional="false"/>
<custom-properties>
<property name="param">
<value>Boolean.FALSE</value>
</property>
<property name="position">
<value>Integer.valueOf(5)</value>
</property>
</custom-properties>
</attribute>
</attributes>
</itemtype>
这里baseStoreParam,orderStartDateParam,orderEndDateParam是参数。
注意:根据预期的结果值和类型,我们需要在 <attributes>
标签中定义该属性的位置和类型。
您可以拆分原始查询及其条件
String query = "SELECT {a},{b},{c} FROM {model} WHERE {d} %s AND {e} %s";
String dStatusParam = "";
String eStatusParam = "";
if (null == dStatus) {
dStatusParam = "IS NULL";
} else {
dStatusParam = "= '" + dStatus + "'";
}
if (null == eStatus) {
eStatusParam = "IS NULL";
} else {
eStatusParam = "= '" + eStatus + "'";
}
query = String.format(query,dStatusParam,eStatusParam);