我有一个“产品”实体,其中包含“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,但我真的不明白如何在我的案例中使用它们
答案 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。