知识点随记

JPA使用Specification动态查询

  • 解决动态多条件查询的问题。我们可能会设置许多查询条件,但实际查询时只会用到其中的某一些条件,动态查询能保证只查询这一部分条件。

实现

  • Repository接口继承JpaSpecificationExecuter<T>
public interface ItemRepository extends 
    JpaRepository<Item,Integer>, JpaSpecificationExecutor<Item>{}
  • 新建处理Specification的类,便于构造筛选条件
public class itemSpecification {
    public static Specification<Item> whereItem(Map<String, Object> params) {
        // 通过匿名内部类实现Specification接口
        // 摘自 https://blog.csdn.net/weixin_46005530/article/details/132626158
        return (Root<Item> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
            List<Predicate> predicates = new ArrayList<>();
            // 处理name参数
            String name = (String) params.get("name");
            if (name != null) {
                // 模糊查询的实现: cb.like
                predicates.add(cb.like(root.get("name"), "%" + name + "%"));
            }
            ...
            // 处理category参数
            String catName = (String) params.get("category");
            CategoryEnum category = CategoryEnum.valueOf(catName);
            if(catName != null){
                predicates.add(cb.equal(root.get("category"), category));
            }
            // 返回封装好的查询条件
            return query.where(
                predicates.toArray(new Predicate[predicates.size()])
            ).getRestriction();
        }
    }
}
  • ServiceImpl层直接findAll
@Override
    public List<Item> getItemByConditions(Map<String, Object> params){
        return itemRepository.findAll(itemSpecification.whereItem(params));
    }

细节

  • 用Map<String, Object>存不确定的筛选条件,模拟了一个不确定格式的JSON
    • 在Controller层可以用@RequestBody传也可以用@RequestParams
@RequestBody Map<String, Object> map
  • 从Enum名字(String)到Enum类(和Integer等价)的转换,用xxxEnum.valueOf(str)
String catName = (String) params.get("category");
CategoryEnum category = CategoryEnum.valueOf(catName);

@data注解

  • @data注解可以自动生成无参构造函数、Getter、Setter和toString等方法
  • 可以用于VO和PO(DAO)的注解,替代@Getter、@Setter、@NoArgsConstructor一系列注解

Docker上部署Mysql Server的持久化

docker run -p 3306:3306 --name mysql \
-v /home/docker/mysql/log:/var/log/mysql \
-v /home/docker/mysql/data:/var/lib/mysql \
-v /home/docker/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql

JavaDoc

项目可以直接自动生成文档

任务栏Tools->Generate JavaDoc

使用@Documented注解可以使这个类出现在文档中