Шаблон репозитория с выражениями QueryDSL: создание реализации QueryDSL для серверной части

У меня есть интерфейс 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...?


person Jordi    schedule 04.12.2015    source источник


Ответы (1)


Для потомков взгляните на следующее:

'QuerydslPredicateExecutor' interface (Spring-Data) and 'XXXXExpressions'
person Big Rich    schedule 19.12.2019