Hi Isomorphic,
I found the following bug in serverside dsRequest.addToCriteria for the current 4.1d nightly (SNAPSHOT_v9.1d_2014-01-22/EVAL Deployment).
I'm using Oracle 11g XE and Java 1.7.0_45 if this is important.
Please create following DMI-fetch method or integrate it in a existing DMI class.
I included four testcases in the java code:
Please see below:
In the ds.xml I have the following lines:
Please let me know if you can't reproduce.
Best regards,
Blama
I found the following bug in serverside dsRequest.addToCriteria for the current 4.1d nightly (SNAPSHOT_v9.1d_2014-01-22/EVAL Deployment).
I'm using Oracle 11g XE and Java 1.7.0_45 if this is important.
Please create following DMI-fetch method or integrate it in a existing DMI class.
I included four testcases in the java code:
- dsRequest.addToCriteria(testSetCriterion) is creating an inner null-criterion for two different calls of new SetCriterion(...)
- 3-param version of dsRequest.addToCriteria() is creating a 0=1 WHERE-clause in one case from above with the same parameters as used above for new SetCriterion(...)
- 3-param version of dsRequest.addToCriteria() works as expected with the other parameters
used for new SetCriterion(...)
Please see below:
Code:
public DSResponse fetchChildResellers(DSRequest dsRequest, HttpServletRequest servletRequest) throws Exception {
int i = dsRequest.getAdvancedCriteria().getCriteriaAsMap().size(); // 0
ArrayList<Long> myList = new ArrayList<Long>();
myList.add(-2L);
myList.add(1L);
SetCriterion testSetCriterion = null;
[B]// Testcase 1):[/B]
testSetCriterion = new SetCriterion("ID", DefaultOperators.InSet.getID(), myList);
[B]// Testcase 2):[/B]
testSetCriterion = new SetCriterion("ID", DefaultOperators.InSet.getID(), myList.toArray());
dsRequest.addToCriteria(testSetCriterion);
Map m = dsRequest.getAdvancedCriteria().getCriteriaAsMap(); // Exception
// Watch dsRequest.getAdvancedCriteria() in Eclipse Debugger Expressions to
// see that the 1st element in
// dsRequest.getAdvancedCriteria() -> criteria ->mCriteria -> elementData ->
// [0] is null.
[B]// Testcase 3):[/B]
// Remove the dsRequest.addToCriteria(testSetCriterion) above and replace by:
dsRequest.addToCriteria("ID", DefaultOperators.InSet.getID(), myList.toArray());
/*
Generates WHERE clause: WHERE ( ('0' = '1')), criteria from log are:
=== 2014-01-22 18:58:45,156 [c-10] INFO SQLDataSource - [builtinApplication.fetchChildResellers] Performing fetch operation with
criteria: {criteria:[{value:[-2,1],fieldName:"ID",operator:"inSet"}],operator:"and",_constructor:"AdvancedCriteria"} values: {criteria:[{value:[-2,1],fieldName:"ID",operator:"inSet"}],operator:"and",_constructor:"AdvancedCriteria"}
*/
[B]// Testcase 4):[/B]
// dsRequest.addToCriteria("ID", DefaultOperators.InSet.getID(), myList);
/*
Works as expected:
Generates WHERE clause: WHERE ( ( (t_reseller.id IN (-2, 1)) AND t_reseller.id IS NOT NULL))
Criteria from log are:
=== 2014-01-22 19:02:30,960 [ec-4] INFO SQLDataSource - [builtinApplication.fetchChildResellers] Performing fetch operation with
criteria: {criteria:[{value:[-2,1],fieldName:"ID",operator:"inSet"}],operator:"and",_constructor:"AdvancedCriteria"} values: {criteria:[{value:[-2,1],fieldName:"ID",operator:"inSet"}],operator:"and",_constructor:"AdvancedCriteria"}
--> Exactly the same as above, but this time the WHERE clause is as expected!
*/
return dsRequest.execute();
}
Code:
<field primaryKey="true" hidden="true" name="ID" type="sequence" /> ..... <serverObject lookupStyle="new" className="com.lmscompany.lms.server.worker.T_RESELLER" /> <operationBindings> <operationBinding operationType="fetch" operationId="fetchChildResellers" serverMethod="fetchChildResellers"> </operationBinding> </operationBindings>
Best regards,
Blama
Comment