Message Boards

Service builder support for BETWEEN finders

Mrs Raghavan, modified 7 Years ago.

Service builder support for BETWEEN finders

New Member Posts: 19 Join Date: 7/28/16 Recent Posts
I'd like to set up a finder for my entity that maps down to a BETWEEN query e.g.

SELECT * FROM table 1 WHERE creation_Date BETWEEN date1 AND date2

<finder name="StatusReport" return-type="Collection">
<finder-column name="creation_Date" comparator="&lt;"></finder-column>
<finder-column name="creation_Date" comparator="&gt;"></finder-column>
</finder>
but when I build the service , I am getting error as Duplicate parameter creation_Date .How to achieve this.

Appreciate response.
Nirmita Prajapati, modified 7 Years ago.

RE: Service builder support for BETWEEN finders

New Member Posts: 4 Join Date: 2/23/15 Recent Posts
As we know that liferay service builder tool will create all required database services but some time we have specific requirement where we need some custom services there we will use dynamic query API to meet those requirements.

So I suggest you to use dynamic query API to use between query.
Mrs Raghavan, modified 7 Years ago.

RE: Service builder support for BETWEEN finders

New Member Posts: 19 Join Date: 7/28/16 Recent Posts
Hi Nirmita,

Yes I have managed to implement between using dynamic query...but I have one issue. For example I have to implement the below query

select *
FROM xxx
where edeclarationDate BETWEEN '2017-01-01' AND '2017-01-12'-
and estatus ='draft' or estatus='submitted' or estatus='Completed'

My dynamic query for above is

criterion1 = RestrictionsFactoryUtil.between("edeclarationDate", fmDate, tDate);
criterion1=RestrictionsFactoryUtil.and(criterion1,RestrictionsFactoryUtil.eq("eStatus",check1));
criterion1 = RestrictionsFactoryUtil.or(criterion1 , RestrictionsFactoryUtil.eq("eStatus", check2));
criterion1 = RestrictionsFactoryUtil.or(criterion1 , RestrictionsFactoryUtil.eq("eStatus", check3));
criterion1 = RestrictionsFactoryUtil.or(criterion1 , RestrictionsFactoryUtil.eq("eStatus", check4));

its not working .Any Idea how to achieve this???

Appreciate response.

Thanks,
Nirmita Prajapati, modified 7 Years ago.

RE: Service builder support for BETWEEN finders

New Member Posts: 4 Join Date: 2/23/15 Recent Posts
Hi Raghavan,

Try this below mention code:
criterion1 = RestrictionsFactoryUtil.or(RestrictionsFactoryUtil.eq("eStatus", check1), RestrictionsFactoryUtil.eq("eStatus", check2),RestrictionsFactoryUtil.eq("eStatus", check3),RestrictionsFactoryUtil.eq("eStatus", check4));
criterion1=RestrictionsFactoryUtil.and(criterion1,RestrictionsFactoryUtil.between("edeclarationDate", fmDate, tDate));

This may help you..
Mrs Raghavan, modified 7 Years ago.

RE: Service builder support for BETWEEN finders

New Member Posts: 19 Join Date: 7/28/16 Recent Posts
Hi Nirmita,

criterion1 = RestrictionsFactoryUtil.or(RestrictionsFactoryUtil.eq("eStatus", check1), RestrictionsFactoryUtil.eq("eStatus", check2),RestrictionsFactoryUtil.eq("eStatus", check3),RestrictionsFactoryUtil.eq("eStatus", check4));

is not working, compilation error.

OR method will accept only 2 criterions.

Please advice.

Appreciate response.
thumbnail
Chandan Sharma, modified 7 Years ago.

RE: Service builder support for BETWEEN finders

Junior Member Posts: 54 Join Date: 3/4/14 Recent Posts
Hi,

You can can try using IN which will also serve the same as OR. Something like this:

String[] astatusArray = { "draft", "submitted", "Completed"};
DynamicQuery activityQuery = DynamicQueryFactoryUtil.forClass(Xxx.class,getClassLoader())
			.add(RestrictionsFactoryUtil.between("edeclarationDate", fmDate, tDate))
			.add(PropertyFactoryUtil.forName("estatus").in(astatusArray));


~Chandan