spring 模糊查询,查询


https://www.5ceo.cn 更多技术博文点击查看




<select id="find" parameterType="com.sfbm.carmall.persistent.model.brand.Brand"

resultType="map">
SELECT
t.brand_id brandId,
t.brand_name brandName,
t.description
description,
t.url url
FROM
t_brand t where t.delFlag=0
<if test="brand_name!=null and  ''!=brand_name ">
and t.brand_name like '%${brand_name}%'
</if>
</select>
resultType

为map集合,参数类型可以为,string,entity,以及map 

1.如果参数类型为string  那么 brand_name like '%${value}%'此处必须为value,如果为其他属性将报no Getter的错误

2.如果是对象entity,则parameterType必须是“package.class”的格式,并且 "%${}%"中的属性必须是entity中的属性。

3.如果参数为map,则parameterType是Java.util.Map,并且"%${}%"中的属性必须是map中的key。

*如果jsp页面用对象传值到control,则jsp页面应该这样写:

<input name="brand_name"> brand_name必须是entity中的属性。并且不用entity.brand_name这样的方式

*control中必须用@ModelAttribute绑定该对象

@ModelAttribute("entity") Entity entity

模糊查询时,%${brand_name}% {}前面不能是#,必须是${}

或者Oracle 用concat(concat('%',#{}),'%')mysql:concat('%',#{},‘%’)

### Spring框架中模糊查询的实现原理 在Spring框架中,模糊查询通常基于JPA(Java Persistence API)或其扩展Hibernate来实现。具体来说,可以通过`Specification`接口或者直接编写JPQL/HQL语句完成复杂的动态查询逻辑。 #### 使用 `Specification` 接口实现模糊查询 `Specification` 是 JPA 提供的一种灵活机制,用于构建复杂查询条件。它允许开发者通过组合多个条件来动态生成SQL查询[^2]。以下是其实现的关键点: 1. **核心方法** `Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb)` 方法是 `Specification` 的主要部分。该方法接收三个参数: - `Root<T>` 表示查询的根对象,即实体类对应的数据库表。 - `CriteriaQuery<?>` 是顶层查询对象,负责定义整个查询结构。 - `CriteriaBuilder` 提供了一系列工具方法,帮助构造各种查询条件。 2. **动态拼接条件** 开发者可以在 `toPredicate` 方法内部使用 `CriteriaBuilder` 构造多种类型的查询条件,比如等于、大于、小于、LIKE等操作符。对于模糊查询,可以利用 `cb.like()` 方法配合通配符 `%` 来匹配字符串的一部分。 #### 示例代码 以下是一个简单的 `Specification` 实现模糊查询的例子: ```java import javax.persistence.criteria.Predicate; import org.springframework.data.jpa.domain.Specification; public class ArticleSpecs { public static Specification<Article> titleContains(String keyword) { return (root, query, criteriaBuilder) -> { if (keyword == null || keyword.isEmpty()) { return criteriaBuilder.conjunction(); } return criteriaBuilder.like(root.get("title"), "%" + keyword + "%"); }; } public static Specification<Article> contentContains(String keyword) { return (root, query, criteriaBuilder) -> { if (keyword == null || keyword.isEmpty()) { return criteriaBuilder.conjunction(); } return criteriaBuilder.like(root.get("content"), "%" + keyword + "%"); }; } } ``` #### Controller 层调用 在控制器层,可以通过注入的服务层调用上述 `Specification` 定义的方法。例如,在 `/articles/search` 路径下接受关键词并执行模糊查询[^4]: ```java @RestController public class ArticleController { @Autowired private ArticleService articleService; @GetMapping("/articles/search") public List<Article> searchArticles(@RequestParam String keyword) { Specification<Article> spec = Specification.where(ArticleSpecs.titleContains(keyword)) .or(ArticleSpecs.contentContains(keyword)); return articleService.findAll(spec); } } ``` #### Service 层实现 服务层则封装了具体的业务逻辑,调用了 Repository 中的 `findAll(Specification spec)` 方法[^4]: ```java @Service public class ArticleService { @Autowired private ArticleRepository articleRepository; public List<Article> searchArticles(String keyword) { Specification<Article> spec = Specification.where(null); if (StringUtils.hasText(keyword)) { spec = spec.or(ArticleSpecs.titleContains(keyword)) .or(ArticleSpecs.contentContains(keyword)); } return articleRepository.findAll(spec); } } ``` #### 总结 Spring 框架中的模糊查询主要是借助 JPA 和 Hibernate 的强大功能实现的。通过 `Specification` 可以轻松地构建复杂的动态查询条件,并且支持 LIKE 运算符进行模糊匹配。这种方式不仅提高了代码的可维护性和灵活性,还能够很好地适应不同的业务需求。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值