Ну… я уж не знаю что у вас там за реализация. Но если 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 пустой будет)
поставил точку на 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}
что оно мне подскажет?
Так пролистайте ниже… у query
должен быть параметр condition
. Раскройте его. Посмотрите что там…
в 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
, что вы вернете из методов загрузки. то и пойдет дальше в приложении.
Спасибо Ярослав, максимально понятно) ``