У меня есть интерфейс Repository
:
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID>
{
Iterable<T> findAll(Specification<T>... specifications)
throws RepositorySystemException;
}
У меня есть один класс сущностей: Resource
, поэтому я расширяю CrudRepository
:
public interface IResourceRepository extends CrudRepository<Resource, String> { }
У меня есть система сохранения ElasticSearch, в которой я хочу хранить/искать свои Resource
объекты, поэтому я создал одну реализацию репозитория для ElasticSearch:
public abstract class ElasticsearchRepository<T, ID extends Serializable>
implements CrudRepository<T, ID> { }
а потом,
public class ResourceRepository extends ElasticsearchRepository<Resource, String>
implements IResourceRepository
До сих пор ничего странного. Теперь я хочу, чтобы мои репозитории могли обрабатывать спецификации запросов или фильтров для поиска в elasticsearch.
Для этого я указываю свои выражения, используя QueryDSL
:
QResource qr = QResource.resource;
Expression exp = qr.source.sourceId.eq("id").and(qr.channel.endsWith("case"));
Я хотел бы отправить этот QueryDSL в мой репозиторий методов findAll(...)
, но я не знаю, как это сделать...
Я не знаю, лучше ли изменить сигнатуру метода, чтобы получать выражения QueryDSL, я не знаю. Однако где мне нужно выполнить преобразование между выражениями QueryDSL и конкретными фильтрами ElasticSearch...?