You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写带多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:58:09