В Liferay 6.1 возможен ли поиск по дате только в поле даты и времени для портлета ServiceBuilder?

Я создал портлет с помощью Service Builder, в котором хранятся некоторые пользовательские данные, а также дата.

соответствующая часть моего файла service.xml

<entity name="ServiceAgreement" local-service="true" remote-service="false">
    <column name="agreementId" type="long" primary="true"></column>
    <column name="agreementVersion" type="double"></column>
    <column name="userId" type="long"></column>
    <column name="agreementTimestamp" type="Date"></column><!-- column w/ the trouble -->
    <column name="groupId" type="long"></column>
    <column name="companyId" type="long"></column>
    <order by="asc">
        <order-column name="agreementTimestamp"></order-column>
    </order>
    <finder name="G_AT" return-type="Collection">
        <finder-column name="groupId"></finder-column>
        <finder-column name="agreementTimestamp"></finder-column>
    </finder>
    <finder name="SignedDate" return-type="Collection">
        <finder-column name="agreementTimestamp"></finder-column>
    </finder>
...

В настоящее время я пишу другой портлет, который будет портлетом отчетов для данных, хранящихся в этом первом портлете.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я выполняю поиск по дате, используя тег, я не получаю никаких ответов от БД для дат, которые, как я знаю, там есть. Я отследил проблему до того факта, что они создали метод findbysignedDate, созданный ServiceBuilder, с поиском по дате, с точностью до миллисекунды!

Запись, которую я хочу получить: Запись, которую нужно получитьНапример, мой портлет отчетов содержит:

int month = Integer.parseInt(request.getParameter("dateMonth"));
int day = Integer.parseInt(request.getParameter("dateDay"));
int year = Integer.parseInt(request.getParameter("dateYear"));
GregorianCalendar cal = new GregorianCalendar();
cal.clear();
cal.set(year, month, day);
Date signedDate = cal.getTime();

try {
   if(signedDate == null || signedDate.getTime() < 0) {
     throw new PortalException("Invalid date input provided.");
} else {
    _log.debug("Signed Date: " + signedDate.toString());

    //get TOS data
    JSONArray tosArray = LiferayHelper.getTOSsBySignedDate(signedDate);
...

И ничего не возвращается в tosArray. Однако, если я напишу это так:

int month = Integer.parseInt(request.getParameter("dateMonth"));
int day = Integer.parseInt(request.getParameter("dateDay"));
int year = Integer.parseInt(request.getParameter("dateYear"));
GregorianCalendar cal = new GregorianCalendar();
cal.clear();
cal.set(year, month, day,18,49,15); //getting REALLY specific here...
cal.add(Calendar.MILLISECOND, 958);
Date signedDate = cal.getTime();

try {
   if(signedDate == null || signedDate.getTime() < 0) {
     throw new PortalException("Invalid date input provided.");
} else {
    _log.debug("Signed Date: " + signedDate.toString());

    //get TOS data
    JSONArray tosArray = LiferayHelper.getTOSsBySignedDate(signedDate);
...

Тогда tosArray содержит правильные данные.

Я просто хочу получить все данные за один день (24-часовой период). Кто-нибудь знает, есть ли встроенный способ обойти это? Или мне нужно переписать файл service.xml? Я застрял, чтобы написать свой собственный метод поиска?

Спасибо.


person CatsAndCode    schedule 27.08.2012    source источник


Ответы (1)


Ответ заключается в использовании настраиваемых запросов, которые Service Builder создаст для вас. Нашел это в конце главы 7 Liferay в действии.

Краткий обзор доступен на сайте Liferay.
http://www.liferay.com/community/wiki/-/wiki/Main/Service+Builder+Finders

Просто помните о строгом соглашении об именах, которое Liferay применяет для этих Finders. Я боролся почти целый день, пытаясь заставить сервис-генератор автоматически создавать мои новые классы поиска, только чтобы обнаружить, что он терпит неудачу, потому что я не назвал свой искатель тем именем, которое ожидал Service Builder.

person CatsAndCode    schedule 04.09.2012