@EnableJpaAuditing 它是用来启动Jpa的审计功能。
jpa querydsl 多表的联合查询
导入依赖 querydsl-jpa 、querydsl-apt
- @NoRepositoryBean
- public interface BaseMongoRepository
extends MongoRepository, QuerydslPredicateExecutor { -
- }
- @Repository
- public interface UserRepository extends BaseMongoRepository
{ - }
-
实体类之间的四种关联关系OneToOne,OneToMany,ManyToOne和ManyToMany

Type Tag Blog User Comment
Type——》Blog 一对多 Blog——》Type 多对一
- public class Type { //Type为被拥有方
- @OneToMany(mappedBy = "type")
- private List
blogs = new ArrayList<>(); - }
- public class Blog {//拥有方
- @ManyToOne
- private Type type;
- }
blog表生成外键 关联字段type_id 拥有方生成外键

- mappedBy
只有OneToOne、OneToMany和ManyToMany这三中关联关系有mappedBy属性。
拥有关联关系的域,如果关系是单向的就不需要。
mappedBy一定是定义在关系的被拥有方,它的值指向拥有方中关于被拥有方的字段。
拥有关系的这一方有建立、解除和更新与另一方关系的能力==拥有外键
出现的问题
template might not exist or might not be accessible by any of the configured Template Resolvers报错
templates下的资源需要通过ViewResolver(视图解析器)去解析访问
需要使用@Controller,不能使用@RestController,不然会以Json格式响应到页面,不会进行视图解析。
- @Controller 和 @RestController的区别
@RestController是@Controller和@ResponseBody的结合体
@RestController类中的所有方法只能返回String、Object、Json等实体对象,不能跳转到模版页面
在springboot、jpa、thymelea项目中未解决
报500 An error happened during template parsing (template: “class path resource [templates/xxx.html]“)
如果是什么都没有的html就可以跳转
出现的问题
SpringBoot报错inferred type 's'for type parameter 's' is not within its bound解决办法
我的版本:2.3.4.RELEASE // SpringBoot2.0版本就没有这个方法 findOne()方法
1.5.7.RELEASE 才有 也没有delete() 改成deleteById()
@Override public Blog getBlog(Long id) { //blogRepository.findOne(id);报错原因 return blogRepository.findById(id).orElse(null); }
组合查询 动态查询
Repository继承JpaSpecificationExecutor
blogRepository.findAll(); (Example
,Pageable)// 根据 Specification 条件,分⻚查询 Page
findAll(Specification
spec, Pageable pageable);
@Override public PagelistBlog(Pageable pageable, Blog blog) { //组合查询 return blogRepository.findAll(new Specification(){ // root 对象 CriteriaQuery 查询条件容器 CriteriaBuilder 表达式 @Override public Predicate toPredicate(Rootroot, CriteriaQuery> cq, CriteriaBuilder cb) { Listpredicates = new ArrayList<>(); if (!"".equals(blog.getTitle()) && blog.getTitle() != null){//判断不为空 //title模糊查询 //放进条件集合 Predicate 作为一个对象封装条件 like(<类型>属性名,值 相当于拼接sql); predicates.add(cb.like(root.get("title"),"%"+blog.getTitle()+"%")); } if (blog.getType().getId() != null){ //type模糊查询 predicates.add(cb.equal(root.get("type").get("id"),blog.getType().getId())); } if (blog.isRecommend()){ //是否推荐 predicates.add(cb.equal(root.get("recommend"),blog.isRecommend())); } //list转数组 cq.where(predicates.toArray(new Predicate[predicates.size()])); return null; } },pageable); }
Predicate
是 JPA 协议⾥⾯提供的查询条件的根基Root
实体对象的根 root.get(String name)得到操作的字段root CriteriaQuery> cq
相当于装查询条件的容器CriteriaBuilder cb
相当于表达式最后是调⽤的 EntityManager
- // select b from Blog b where b.title like %内容%
- @Query("select b from Blog b where b.title like ? 1 or b.content like ?1") // ?1 代表第一个参数 ?2 第二个参数
- Page
findByQuery(String query,Pageable pageable);
出现的问题
报错
解决:
@Override public ListlistRecommendBlogTop(Integer size) { Sort sort = Sort.by(Sort.Direction.DESC,"updateTime"); Pageable pageable = PageRequest.of(0,size,sort); return blogRepository.findTop(pageable); }
出现的问题
IllegalArgumentException: Could not resolve placeholder in string value
@Value("${comment.avatar}") private String avatar;映射yml文件
原因:配置文件中没有对应的key
出现的问题
?1 占位符
FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Mixing of ? parameters and other forms like ?1 is not supported!
原因。。。多了个空格 ?1
另外:占位符的位置必须与参数保持一致
出现的问题
@RequestParam @RequestParam注解要有默认值或者@RequestParam(value = “id1”,required = false)不然出问题@PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中