Spring Data JPA 使用LIKE模糊查询的问题

在学习使用 Spring Data JPA 的时候,在做一个自定义模糊查询的时候,出了点问题,这里记录下。 目的:根据用户名模糊查询 工具:Spring+SpringMVC+Spring Data JPA

代码一览

1、UserDao.java
  1. package com.liuyanzhao.blog.dao;
  2. import com.liuyanzhao.blog.entity.User;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import java.util.List;
  5. /**
  6.  * @author 言曌
  7.  * @date 2017/11/28 下午3:31
  8.  */
  9. public interface UserDao extends JpaRepository<User, Integer> {
  10.     //根据学号查询
  11.     List<User> findByUsernameLike(String username);
  12. }
  2、UserService.java
  1. package com.liuyanzhao.blog.service;
  2. import com.liuyanzhao.blog.entity.User;
  3. import java.util.List;
  4. /**
  5.  * @author 言曌
  6.  * @date 2017/11/28 下午3:32
  7.  */
  8. public interface UserService {
  9.     //根据用户名查询模糊用户
  10.     List<User> findByUsernameLike(String username);
  11. }
  3、UserServiceImpl.java
  1. package com.liuyanzhao.blog.service.Impl;
  2. import com.liuyanzhao.blog.dao.UserDao;
  3. import com.liuyanzhao.blog.entity.User;
  4. import com.liuyanzhao.blog.service.UserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import javax.transaction.Transactional;
  8. import java.util.List;
  9. /**
  10.  * @author 言曌
  11.  * @date 2017/11/28 下午3:32
  12.  */
  13. @Service
  14. @Transactional
  15. public class UserServiceImpl implements UserService {
  16.     @Override
  17.     public List<User> findByUsernameLike(String username) {
  18.         return userDao.findByUsernameLike(username);
  19.     }
  20. }
  4、UserController.java
  1. package com.liuyanzhao.blog.controller;
  2. import com.liuyanzhao.blog.entity.User;
  3. import com.liuyanzhao.blog.service.UserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.web.bind.annotation.*;
  7. import org.springframework.web.servlet.ModelAndView;
  8. import javax.servlet.http.HttpServletRequest;
  9. import java.util.List;
  10. /**
  11.  * @author 言曌
  12.  * @date 2017/11/28 下午3:33
  13.  */
  14. @Controller
  15. @RequestMapping(value = "/admin/user")
  16. public class UserController {
  17.     @RequestMapping(value = "/search")
  18.     public ModelAndView search(HttpServletRequest request) {
  19.         ModelAndView modelAndView = new ModelAndView();
  20.         String query = request.getParameter("query");
  21.         List<User> userList = userService.findByUsernameLike(query);
  22.         modelAndView.addObject("userList",userList);
  23.         modelAndView.addObject("query",query);
  24.         modelAndView.setViewName("/admin/user/list");
  25.         return modelAndView;
  26.     }
  27. }
 

二、效果图

1、如图,这是 user 列表   2、我们在搜索框输入 zhangsan,如我们所愿   3、我们输入 zhang,查询结果为空    

三、问题原因,解决方案

原因其实很简单,因为没有加 %%  

解决方案一、

知道原因就好办了,我们通常是不想在搜索框里输入%%的,而让程序帮我加上。 比如这里我们在 UserServiceImpl.java里加上的参数里加上 %%
  1. @Override
  2. public List<User> findByUsernameLike(String username) {
  3.     return userDao.findByUsernameLike("%"+username+"%");
  4. }
重启服务器,现在就可以啦  

解决方法二、

使用 @Query 自定义查询语句 修改 UserDao.java
  1. package com.liuyanzhao.blog.dao;
  2. import com.liuyanzhao.blog.entity.User;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.data.jpa.repository.Query;
  5. import java.util.List;
  6. /**
  7.  * @author 言曌
  8.  * @date 2017/11/28 下午3:31
  9.  */
  10. public interface UserDao extends JpaRepository<User, Integer> {
  11.     //根据用户名模糊查询
  12.     @Query("select u from User u where u.username like %?1%")
  13.     List<User> findByUsernameLike(String username);
  14. }
?1 表示第一个参数 效果和方法一是一样的。     本文地址:https://liuyanzhao.com/6805.html

发表评论

目前评论:2

  • avatar Redfisky

    这边第二个项目准备用spring boot+jpa了,来看看博主,以防踩坑哈哈。 安全方面推荐博主看看shiro,比spring security好用。