如何编写带多OR条件的JPA Repository findBy查询方法?
实现Spring Data JPA商品名称/品牌的模糊搜索
没问题,我来帮你搞定这个搜索功能的实现!首先你设想的Repository方法写法不符合Spring Data JPA的规则,咱们一步步调整,轻松实现需求:
1. 正确编写Repository的查询方法
Spring Data JPA支持通过方法命名规则自动生成SQL,针对你的需求(同一个关键词匹配商品名称或品牌的模糊搜索),有两种常用实现方式:
方式一:利用方法命名规则
直接按照规则定义方法,Spring会自动解析生成LIKE查询:
import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface ProductRepository extends JpaRepository<Product, Integer> { // 匹配prodName包含关键词 或者 prodBrand包含关键词的商品 List<Product> findByProdNameContainingOrProdBrandContaining(String searchKeyword); }
这里的Containing等价于SQL中的LIKE %关键词%,方法会自动生成:
SELECT * FROM product WHERE prod_name LIKE ?1 OR prod_brand LIKE ?1
方式二:使用@Query注解(更灵活)
如果需要更直观的SQL控制,可以用@Query注解自定义查询:
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; public interface ProductRepository extends JpaRepository<Product, Integer> { @Query("SELECT p FROM Product p WHERE p.prodName LIKE %:keyword% OR p.prodBrand LIKE %:keyword%") List<Product> searchProducts(@Param("keyword") String keyword); }
这种方式适合复杂查询场景,参数通过@Param绑定到JPQL语句中。
2. 控制器代码调整
把你原来的控制器代码改成调用上面的Repository方法即可:
// 方式一的调用 List<Product> productList = productRepository.findByProdNameContainingOrProdBrandContaining(search); // 或者方式二的调用 // List<Product> productList = productRepository.searchProducts(search); model.addAttribute("products", productList);
3. Thymeleaf中的使用
不需要额外创建新的模型或函数,直接使用model中传递的products集合即可:
展示搜索结果
<div class="product-list" th:each="product : ${products}"> <div class="product-item"> <h4 th:text="${product.prodName}">商品名称</h4> <p th:text="${product.prodBrand}">品牌</p> <p th:text="${product.price}">价格</p> <img th:src="${product.prodImage}" th:alt="${product.prodName}" /> <!-- 其他字段按需展示 --> </div> </div>
搜索表单示例
如果需要前端的搜索输入框,可以这样写:
<form th:action="@{/products/search}" method="get"> <input type="text" name="search" placeholder="搜索商品名称或品牌..." th:value="${param.search}" /> <button type="submit">搜索</button> </form>
对应的控制器请求映射:
@GetMapping("/products/search") public String searchProducts(@RequestParam("search") String search, Model model) { List<Product> productList = productRepository.findByProdNameContainingOrProdBrandContaining(search); model.addAttribute("products", productList); return "product-list"; // 替换成你的视图模板名称 }
总结
不需要创建额外的函数或模型,用上面的方法就能完美实现你的搜索需求啦。如果后续有更复杂的查询逻辑(比如多条件组合),再考虑扩展即可。
内容的提问来源于stack exchange,提问作者Rheza001
相关产品推荐
相关产品推荐

