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);
参数简单化
/** * @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事务并发权限管理等等
模糊查询:Spring Data JPA 如何进行模糊查询(LIKE) ?