知识点随记
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
传
- 在Controller层可以用
@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
注解可以使这个类出现在文档中