使用JpaRepository进行动态搜索查询

3
我有一个“产品”实体,包括“id”、“productName”和“price”。
我使用Angular ng-table实现了服务器端的分页和筛选。
我的客户端发送了一个JSON,如下:
"{"page":1,"sort":"DESC","orderBy":"productName","filter":{"productName":"test","price":300}}"

但可能是这样的

"{"page":1,"sort":"","orderBy":"","filter":{}}"

我该如何使用jpaRepository实现这种动态查询?
query = "select * FROM products WHERE 1=1 "
for (Map.Entry<String, String> filter : filters.entrySet()) {
    String key = filter.getKey();
    String value = filter.getValue();
    query+= "AND " + " LIKE %" + value + "% "
}

if(!orderBy.isEmpty())
{
  query.="ORDER BY " + orderBy + " ";
}
etc.

my IProductRepository.java

public interface IProduitRepository extends JpaRepository<Product, Long> {
    @Query("select p from Produit p where p.price = :x")
    public Page<Product> customFindByPrice(@Param("x") String name,Pageable p);

    public Page<Product> findByPrice(double price, Pageable p);
}

那么我该如何使用JpaRepository实现动态搜索查询呢?

我知道predicate,但我不太理解如何在我的情况下使用它们。

2个回答

2

抱歉,我无法接受您的回答,我希望每个实体都有一个仓库,该仓库实现JpaRepository并允许按照我的要求创建动态请求。ElasticSearch似乎很好,但答案太具体,而且不是我想要的。我不希望为我的产品类创建多个仓库,并且我希望保留JpaRepository实现。 - amdev

1
对于动态查询,您可以使Spring Data JPA存储库扩展QueryDslPredicateExecutor,除了扩展CrudRepository。 这将使您可以访问存储库上的findOne(谓词)findAll(谓词)等方法。
关于使用QueryDSL与Spring Data模块的详细官方文档并不多,但有在线教程,例如this one,提供了一个不错的介绍,如何在Spring Data JPA中使用QueryDSL。
或者,如果您有非常简单的动态查询,或者想保持在JPA领域内,可以将存储库扩展为JpaSpecificationExecutor,以获得访问存储库上的findOne(规范)findAll(规范)等方法的权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接