Работа интерфейса Filter с сущностями DTO

Ну… я уж не знаю что у вас там за реализация. Но если employeeService.employeeList быстро справляется со своей задачей, то вызов ее же в DataStore должен быть так-же быстрым.

Подумаю над этим

А что это за другая база? Зачем вам Нестандартное хранилище, а не Дополнительное хранилище?

private Optional<Employee> findByNumber(String number) {
        return employeeDc.getItems().stream()
                .filter(employee -> Objects.equals(employee.getJobNumber(), number))
                .findFirst();
    }

Если бы мы разрабатывали классический Java проект, то метод приведённый выше разместили бы на каком -нибудь интерфейсе работы с Repository или DAO Service. а вот где его применить в архитектуре Jmix. Кроме контроллера ничего на ум не приходит, но как сним взаимодействовать если дескриптор на писан в формате XML?

Другая база лежит на серваке(не реляционная, получить инфу можно только из JSON), она обнавляется каждый день и т.д., но это временно
Чесно говоря не задумывался о разнице нестандартного и дополнительного хранилища, я так понимаю стоит перечитать доку, это разные хранилища?

Все зависит от вашей реализации. Какой нибудь dataContainer хранит данные в экране. Не нужно в него грузить ВСЕ данные из базы. Ибо если объектов более 10к, могут начаться проблемы.

Если у вас 2 бд, то лучше канечно использовать дополнительное хранилище.

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

Перечитал доку, на данном этапе мне было удобно использовать именно нестандартное хранилище, а не дополнительное.

А… ну в таком случае да. Доп хранилище не подойдет.

По поводу findByNumber - как я понимаю это вы хотите в фильтр засунуть. Но тут надо быть уверенным что все данные загружены в dataCollection. А вообще всякие Repository или DAO Service вы можете вызывать в своем нестандартном хранилище или loadDelegate раз уж на то пошло. Проверяете что у вас в Condition и грузите.

В документации про condition одна строчка и пример который в моём случае не работает, я не хоть убей не понимаю что нужно там проверить

Встанте дебагом в вызов. Посмотрите что там в Condition передается. Обычно там обертка из LogicalCondition внутри которой все Condition лежат. В вашем случае там должен быть PropertyCondition (если фильтр стоит и там параметр есть, иначе condition пустой будет)

1 симпатия

поставил точку на return метода:

@Install(to = "employeesDl", target = Target.DATA_LOADER)
    private List<Employee> employeesDlLoadDelegate(LoadContext<Employee> loadContext) {
        return employeeService.employeeList;
    }

получил в дэбаге-
{‘null’, condition=([jobNumber equal :jobNumberZFAGctzI]), sort=null, firstResult=0, maxResults=50}
Снимок1
что оно мне подскажет?

Так пролистайте ниже… у query должен быть параметр condition. Раскройте его. Посмотрите что там…

Снимок1
в condition вроде как указана проперти по значению которой можно вести поиск конкретного экземпляра сущности, если я правильно понимаю, может тогда проблема не с самим поиском, а именно с отрисовкой экрана

Может быть вы меня не до конца понимаете. Вот у вас есть condition. У себя в коде проверяете есть ли он. Если есть. Берете значения из parametrValue и вызываете функцию которая вернет список сущностей соответсвующие parametrValue. Или вы думаете, что DataStore автоматом вам как-то отфильтрует значения?

Точно не доконца) вот по примеру моего работающего кода с JPA, добавил такой же фильтр в XML- экран employee.browse, Сам контейнер экрана наполняется данными, так как список сотрудников отображается. Как я понимаю интерфейс filter с сущностями хранящимеся в виртуальном хранилище должен работать так же как и с теми что в БД.

 <filter id="filter"
                collapsable="true"
                collapsed="true"
                dataLoader="employeesDl" caption="Поиск сотрудника">
            <properties include=".*"/>
            <configurations>
                <configuration id="defaultConfiguration" name="   "
                               default="true">
                    <propertyFilter property="jobNumber"
                                    caption="Табельный №"
                                    operation="EQUAL"
                                    operationEditable="true"  />
                </configuration>
            </configurations>
        </filter>

Берете значения из parametrValue и вызываете функцию которая вернет список сущностей соответсвующие parametrValue я не понимаю куда ёё нужно взять/добавить, это же делается на UI, в параметр фильтра передается значение (номер конкретного сотрудника) и должна отобразиться соответствующая запись, или я что - то не упускаю

Если вы переписываете loadDelegate экрана. То из loadContext. Берете condition. Оттуда берете parametrValue. И отфильтровываете employeeService.employeeList по этому параметру (А лучше вообще какой-то отдельный метод на ваш сервис, который будет запрашивать данные с нужным фильтром). То что вы вернете из employeesDlLoadDelegate, то и будет отображено в таблице.

то же самое и с DataStore, что вы вернете из методов загрузки. то и пойдет дальше в приложении.

1 симпатия

Спасибо Ярослав, максимально понятно) ``