使用QueryDSL表达式的存储库模式:为后端创建QueryDSL实现

时间:2015-12-04 13:15:12

标签: java-ee repository-pattern specifications 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> { }

我想要存储/搜索我的Resource对象的ElasticSearch持久性系统,因此我为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过滤器之间的转换......?

1 个答案:

答案 0 :(得分:1)

对于后代,请看以下内容:

'QuerydslPredicateExecutor' interface (Spring-Data) and 'XXXXExpressions'