JPA单表存储List与模糊查询

Posted leayun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA单表存储List与模糊查询相关的知识,希望对你有一定的参考价值。

当需要在数据库中存储简单的List对象,如List<String>等对象时,如果不想使用OneToMany或者ManyToMany时,可以考虑将List对象转换为JSON并存储。

使用自定义注解:

@Convert(converter = JpaConverterListJso.class)

自定义转换器

public class JpaConverterListJso implements AttributeConverter<Object, String> 

    @Override
    public String convertToDatabaseColumn(Object o) 
        return JSON.toJSONString(o);
    

    @Override
    public Object convertToEntityAttribute(String s) 
        return JSON.parseArray(s);
    

这样即存储时将简单List对象转换为JSON字符串存入数据库,又能将JSON字符串转为简单List对象取出
但是使用以上功能后,会使得JPA的模糊查询使用Like查询出现问题,该字段传入参数时会被JPA自动加上双引号。这是由Converter导致的。

为了解决模糊的问题。可以使用如下操作:

expressions.add(criteriaBuilder.greaterThan(criteriaBuilder.locate(root.get("station"), "\\"" + station + "\\""), 0));

该操作中,criteriaBuilder.locate将需要查询的条件传入取得该字段中查询条件的坐标,如果查询到坐标,即返回大于等于1的坐标位置。然后使用criteriaBuilder.greaterThan判断坐标是否大于0,如果大于0即为找到该查询条件。

模糊查询:Spring Data JPA 如何进行模糊查询(LIKE) ?

原文详见----->  https://blog.csdn.net/czx1204/article/details/79131281

一. 方法一

1.  Controller层:
  方法参数如下,一定要加 "%"+name+"%"
/**
 * @description:
* @author: 程志祥<[email protected]com>
 * @date: 2018/1/22 下午5:15
 * @version: V1.0
 */
@RestController
public class UserController {

    @Autowired
    private TeamRepository teamRepository;

    @GetMapping("/findByNameLike")
    public List<Team> findByNameLike(String name) {
        // 一定要加 "%"+参数名+"%"
        return teamRepository.findByNameLike("%"+name+"%");
    }

}
2. Dao层:
 一定要使用 JPA 规定的形式 findBy+参数名+Like(参数)
/**
 * @description: 数据层
 * @author: 程志祥<[email protected]com>
 * @date: 2018/1/18 上午10:52
 * @version: V1.0
 */
public interface TeamRepository extends JpaRepository<Team, String> {

    
    List<Team> findByNameLike(String name);
 

二. 方法二

 1. Controller:
 
 参数简单化
 
/**
 * @description:
* @author: 程志祥<[email protected]com>
 * @date: 2018/1/22 下午5:15
 * @version: V1.0
 */
@RestController
public class UserController {

    @Autowired
    private TeamRepository teamRepository;

    @GetMapping("/findByNameLike")
    public List<Team> findByNameLike(String name) {
        return teamRepository.findByNameLike(name);
    }

}
2.Dao层:
需要自己定义SQL语句
 
/**
 * @description:  * @author: 程志祥<[email protected]com>
 * @date: 2018/1/18 上午10:52
 * @version: V1.0
 */
public interface TeamRepository extends JpaRepository<Team, String> {

    @Query(value = "select t from Team t where t.name like ‘%?1%‘")
    List<Team> findByNameLike(String name);
 
           生活不易,且行且珍惜,谢谢


以上是关于JPA单表存储List与模糊查询的主要内容,如果未能解决你的问题,请参考以下文章

关于mysql,需要掌握的基础:CRUD存储引擎单表查询相关多表查询join事务并发权限管理等等

jpa ?1 /?2 意义

模糊查询:Spring Data JPA 如何进行模糊查询(LIKE) ?

thinkphp5 怎么将变量作为模糊查询条件

Spring data jpa模糊查询,根据某一个字段,或者多个字段进行模糊查询

JPA自定义模糊查询并将查询结果分页