使用JpaRepository进行动态搜索查询

时间:2015-11-05 21:43:38

标签: spring hibernate spring-data spring-data-jpa

我有一个“产品”实体,其中包含“id”“productName”和“price”

我实现了服务器端分页并使用角度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.

我 的 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 个答案:

答案 0 :(得分:1)

对于动态查询,除了扩展QueryDslPredicateExecutor之外,您还可以使Spring Data JPA存储库扩展CrudRepository。这样,您就可以访问存储库中的findOne(Predicate)findAll(Predicate)等方法。

没有关于将QueryDSL与Spring数据模块一起使用的大量官方文档,但是有一些在线教程,例如this one,它们提供了使用带有Spring Data JPA的QueryDSL的正确介绍。

或者,如果您有非常简单的动态查询,或者您希望保留在JPA范围内,则可以从JpaSpecificationExecutor扩展您的存储库,以获取对findOne(Specification)和{{1}等方法的访问权限在存储库上。

答案 1 :(得分:1)

您可以将弹性搜索用作最快的搜索引擎。 为了形成查询,我强烈建议使用SerchQueryParser:https://www.npmjs.com/package/search-query-parser