在本教程中,您将学习使用 Spring Data JPA、Hibernate、MySQL 和 Thymeleaf 为现有 Spring Boot 应用程序实现过滤/搜索功能。假设我们有一个现有的 Spring Boot 应用程序,它显示如下产品列表:
![springboot里面搜索怎么实现 springboot筛选_开发语言](https://s2.51cto.com/images/blog/202406/22220740_6676daaca083e18137.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
数据库中可以有很多产品,所以我们想添加搜索功能,帮助用户根据特定关键字轻松找到产品。
本教程中的代码示例基于项目管理器项目,该项目可以从这个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 运算符比较其值:
您可以通过连接所有相关字段来简化搜索查询,如下所示:
@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筛选_开发语言_02](https://s2.51cto.com/images/blog/202406/22220740_6676daacd3fe043467.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
因为我们搜索包含关键字的任何字段,所以输入usa将显示所有美国制造的产品:
![springboot里面搜索怎么实现 springboot筛选_搜索_03](https://s2.51cto.com/images/blog/202406/22220741_6676daad0c62a72925.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
到目前为止,我已经与您分享了使用 Spring Data JPA、Hibernate、MySQL 和 Thymeleaf 实现过滤/搜索功能或现有 Spring Boot 项目的解决方案。您也可以在下面观看本教程的视频版本,并在附件部分下载示例项目。
附件: