Выбор в фильтре по секундам

Добрый день. Столкнулся с проблемой. При использовании стандартного фильтра по дате отсутствует возможность фильтровать дату по конкретной секунде. Данные приходят из бд вместе с секундами, поэтому при использовании “=” данные за конкретную секунду не выбираются.
Вопрос

вопрос(1)

вопрос(2)

Возможно ли стандартному фильтру задать точность выборки по секундам?

UP: Все ещё интересно и актуально.
Поидее TemporalType.TIMESTAMP должен выводить в похожем формате
dd.MM.yyyy hh:mm:ss. Однако в фильтре при настройке кастомного поля “Дата и время” задается без секунд.

Добрый день,

В компоненте Filter сейчас к сожалению недостаточно точек расширения, чтобы можно было легко настраивать поля ввода параметров.

Поэтому чтобы создавать другой компонент с секундами, придется разобраться в логике класса FilterDelegate и соседних, где сосредоточена логика работы фильтра. Для кастомизации нужно переопределить несколько классов CUBA в проекте.

Пример похожей кастомизации фильтра можно посмотреть в проекте в другой теме:

Вроде получилось. Для интересующихся:

Для изменения точности расширил класс com.haulmont.cuba.gui.components.filter.Param

Листинг ParamExt
public ParamExt(Builder builder) {
    super(builder);
}
@Override
protected Component createDateField(Class javaClass, ValueProperty valueProperty) {
    UserSession userSession = userSessionSource.getUserSession();
    boolean supportTimezones = false;
    boolean dateOnly = false;
    if (property != null) {
        TemporalType tt = (TemporalType) property.getAnnotations().get(MetadataTools.TEMPORAL_ANN_NAME);
        dateOnly = tt == TemporalType.DATE || LocalDate.class.equals(javaClass);
        Object ignoreUserTimeZone = metadataTools.getMetaAnnotationValue(property, IgnoreUserTimeZone.class);
        supportTimezones = !dateOnly && !Boolean.TRUE.equals(ignoreUserTimeZone);
    } else if (LocalDate.class.equals(javaClass)) {
        dateOnly = true;
    } else if (java.sql.Date.class.equals(javaClass)) {
        dateOnly = true;
        if (useUserTimeZone) {
            supportTimezones = true;
        }
    } else {
        supportTimezones = true;
    }
    if (inExpr) {
        ListEditor listEditor = uiComponents.create(ListEditor.class);
        ListEditor.ItemType itemType = dateOnly ? ListEditor.ItemType.DATE : ListEditor.ItemType.DATETIME;
        listEditor.setItemType(itemType);
        if (userSession.getTimeZone() != null && supportTimezones) {
            listEditor.setTimeZone(userSession.getTimeZone());
        }
        initListEditor(listEditor, valueProperty);
        return listEditor;
    }

    DateField<Object> dateField = uiComponents.create(DateField.NAME);
    dateField.setDatatype(datatypeRegistry.getNN(javaClass));

    DateField.Resolution resolution;
    String formatStr;
    if (dateOnly) {
        resolution = com.haulmont.cuba.gui.components.DateField.Resolution.DAY;
        formatStr = messages.getMainMessage("dateFormat");
    } else {
        resolution = com.haulmont.cuba.gui.components.DateField.Resolution.SEC;
        formatStr = messages.getMainMessage("dateTimeFormat");
    }
    dateField.setResolution(resolution);
    dateField.setDateFormat(formatStr);
    if (userSession.getTimeZone() != null && supportTimezones) {
        dateField.setTimeZone(userSession.getTimeZone());
    }

    dateField.addValueChangeListener(e ->
            _setValue(e.getValue(), valueProperty));

    dateField.setValue(_getValue(valueProperty));
    return dateField;
}

Если конкретно, то поменял точность при создании поля, а также указал другое форматирование даты в главном пакете сообщений.

resolution = com.haulmont.cuba.gui.components.DateField.Resolution.SEC
formatStr = messages.getMainMessage("dateTimeFormat")

формат

После этого изменил используемый бин на кастомный.
1_1

Пока поломок и багов связанных с изменениями не обнаружил. Если кто-то более опытный укажет на них, то буду благодарен.

3 симпатии