在本教程中,您将学习使用 Spring Data JPA、Hibernate、MySQL 和 Thymeleaf 为现有 Spring Boot 应用程序实现过滤/搜索功能。假设我们有一个现有的 Spring Boot 应用程序,它显示如下产品列表:

springboot里面搜索怎么实现 springboot筛选_字段

数据库中可以有很多产品,所以我们想添加搜索功能,帮助用户根据特定关键字轻松找到产品。

本教程中的代码示例基于项目管理器项目,该项目可以从这个Spring Boot CRUD 教程下载。

1.构建搜索查询

我不使用 Criteria API,因为搜索查询是静态的——一个简单的 JPQL 就足够了。更新ProductRepository接口以声明搜索查询,如下所示:


public interface ProductRepository extends JpaRepository<Product, Long> {


 


@Query("SELECT p FROM Product p WHERE p.name LIKE %?1%"


+ " OR p.brand LIKE %?1%"


+ " OR p.madein LIKE %?1%"


+ " OR CONCAT(p.price, '') LIKE %?1%")


public List<Product> search(String keyword);


}



如您所见,此查询搜索具有与指定关键字匹配的字段之一的产品。包含关键字的任何字段(名称、品牌、制造商或价格)将包含在结果中的产品。

请注意,对于数字字段,我们必须将其与空字符串连接,以便可以使用 LIKE 运算符比较其值:



CONCAT(p.price, '')



您可以通过连接所有相关字段来简化搜索查询,如下所示:


@Query("SELECT p FROM Product p WHERE CONCAT(p.name, p.brand, p.madein, p.price) LIKE %?1%")


public List<Product> search(String keyword);




 


更准确地说,我们应该用空格连接每个字段,以避免字符串连接产生不希望的结果。所以最终的搜索查询将是:


@Query("SELECT p FROM Product p WHERE CONCAT(p.name, ' ', p.brand, ' ', p.madein, ' ', p.price) LIKE %?1%")



如您所见,使用这样的搜索查询比使用更适合动态查询的 Criteria API 更易于理解且简单得多。

 

2. 更新 Spring Service 和 Controller 类

接下来,更新ProductService类的listAll()方法以将关键字作为参数,如下所示:


@Service


public class ProductService {


@Autowired


private ProductRepository repo;


 


public List<Product> listAll(String keyword) {


if (keyword != null) {


return repo.search(keyword);


}


return repo.findAll();


}


 


...


}



如果关键字为空,则调用存储库接口(由 Spring Data JPA 提供)的默认findAll()方法。

并更新控制器类中的处理程序方法以从 URL 中的参数中读取关键字:


@Controller


public class AppController {


@Autowired


private ProductService service;


 


@RequestMapping("/")


public String viewHomePage(Model model, @Param("keyword") String keyword) {


List<Product> listProducts = service.listAll(keyword);


model.addAttribute("listProducts", listProducts);


model.addAttribute("keyword", keyword);


 


return "index";


}


 


...


}



如您所见,除了存储在listProducts对象中的搜索结果添加到模型之外,关键字也添加到模型中,因此我们可以在搜索表单中再次显示关键字。

 

3. 带有 Thymeleaf 的代码搜索表单

要在视图页面中添加带有搜索按钮的过滤器文本框,请在index.html文件的顶部添加以下代码:


<form th:action="@{/}">


Filter: <input type="text" name="keyword" id="keyword" size="50" th:value="${keyword}" required />


 


<input type="submit" value="Search" />


 


<input type="button" value="Clear" id="btnClear" onclick="clearSearch()" />


</form>



如您所见,我们使用 Thymeleaf 来呈现表单操作和关键字的值。清除按钮允许用户重置搜索表单。还要编写以下 Javascript 代码:


<script type="text/javascript">


function clearSearch() {


window.location = "[[@{/}]]";


}


</script>



清除搜索将显示所有产品。请注意,我们使用 Thymeleaf 表达式[[@{/}]]来正确呈现主页 URL。

 

4.测试搜索/过滤功能

现在,启动我们的 Spring Boot 应用程序。转到主页并输入电话作为关键字,然后单击搜索按钮。结果将显示如下:

springboot里面搜索怎么实现 springboot筛选_java_02

 

因为我们搜索包含关键字的任何字段,所以输入usa将显示所有美国制造的产品:

springboot里面搜索怎么实现 springboot筛选_字段_03

到目前为止,我已经与您分享了使用 Spring Data JPA、Hibernate、MySQL 和 Thymeleaf 实现过滤/搜索功能或现有 Spring Boot 项目的解决方案。您也可以在下面观看本教程的视频版本,并在附件部分下载示例项目。



附件:

ProductManagerFilterSearch.zip

[示例 Spring Boot 项目]

73 KB