jmix 2.4.2
Вопрос:
В EclipseLink есть возможность создавать индексы в кэше сущностей с помощью @CacheIndex
, чтобы можно было пользоваться кэшем не только по id, но и по другим атрибутам (например username).
Можно ли сделать такое в Jmix?
Мотивация:
Кэш сущностей не инвалидируется при добавлении/удалении сущностей, все изменения автоматически проходят через него, поэтому он остается актуальным и не требует запросов к БД, в отличие от кэша запросов. Хотелось бы иметь возможно пользоваться этой фишкой не только для запросов по id, но и по другим атрибутам.
Мои попытки разобраться:
Пробовал @CacheIndex
, не работает.
Проходился дебагером, увидел, что индекс по атрибуту формируется и сохраняется нормально (IdentityMapManager.cacheIndexes
), но не используется при запросах.
Насколько я разобрался jmix расценивает любые запросы по атрибутам как запрос с множественным результатом, т.е. они идут через JmixEclipseLinkQuery.getResultList()
, где к запросу прикрепляется query.setHint(QueryHints.REFRESH, HintValues.TRUE)
(JmixEclipseLinkQuery#472), и из-за этого кэш не срабатывает.
Пробовал через Repository
с и без First, с и без @QueryHint
:
@QueryHints(@QueryHint(name = QueryHints.REFRESH, value = HintValues.FALSE))
Optional<MyEntity> findFirstByMyAttribute(String myAttribute);
Пробовал через DataManager
:
LoadContext<NewEntity_1> context = new LoadContext<>(metadata.getClass(MyEntity.class));
context.setQueryString("select e from MyEntity e where e.myAttribute= :myAttribute");
context.getQuery().setParameter("myAttribute", "someValue");
context.getQuery().setMaxResults(1);
context.setHints(Map.of(QueryHints.REFRESH, HintValues.FALSE));
dataManager.load(context);
Всё равно запрос идет через getResultList()
, а не getSingleResult()
.