使用JPA

@EnableJpaAuditing 它是用来启动Jpa的审计功能。

jpa querydsl 多表的联合查询

导入依赖 querydsl-jpa 、querydsl-apt

Repository接口, 继承QuerydslPredicateExecutor接口
@NoRepositoryBean
public interface BaseMongoRepository<T> extends MongoRepository<T, String>, QuerydslPredicateExecutor<T> {

}
继承BaseMongoRepository方法
@Repository
public interface UserRepository extends BaseMongoRepository<User> {
}

实体类之间的四种关联关系OneToOne,OneToMany,ManyToOne和ManyToMany

 

Type Tag Blog User Comment

Type——》Blog 一对多 Blog——》Type 多对一

public class Type { //Type为被拥有方
@OneToMany(mappedBy = "type")
private List<Blog> 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格式响应到页面,不会进行视图解析。

cr. http://t.csdn.cn/V0nj8

@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解决办法

我的版本:<version>2.3.4.RELEASE</version>
// SpringBoot2.0版本就没有这个方法 findOne()方法

<version>1.5.7.RELEASE</version> 才有

也没有delete() 改成deleteById()
@Override
public Blog getBlog(Long id) {
//blogRepository.findOne(id);报错原因
return blogRepository.findById(id).orElse(null);
}
组合查询 动态查询

Repository继承JpaSpecificationExecutor<T>

blogRepository.findAll(); (Example<S>,Pageable)

// 根据 Specification 条件,分⻚查询 Page<T>

findAll(Specification<T> spec, Pageable pageable);

 

@Override
public Page<Blog> listBlog(Pageable pageable, Blog blog) {
//组合查询
return blogRepository.findAll(new Specification<Blog>(){
// root 对象 CriteriaQuery 查询条件容器 CriteriaBuilder 表达式
@Override
public Predicate toPredicate(Root<Blog> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
if (!"".equals(blog.getTitle()) && blog.getTitle() != null){//判断不为空
//title模糊查询
//放进条件集合 Predicate 作为一个对象封装条件 like(<类型>属性名,值 相当于拼接sql);
predicates.add(cb.like(root.<String>get("title"),"%"+blog.getTitle()+"%"));
}
if (blog.getType().getId() != null){
//type模糊查询
predicates.add(cb.equal(root.<Type>get("type").get("id"),blog.getType().getId()));
}
if (blog.isRecommend()){
//是否推荐
predicates.add(cb.equal(root.<Boolean>get("recommend"),blog.isRecommend()));
}
//list转数组
cq.where(predicates.toArray(new Predicate[predicates.size()]));
return null;
}
},pageable);
}

Predicate
是 JPA 协议⾥⾯提供的查询条件的根基
Root<T> root
实体对象的根 root.get(String name)得到操作的字段
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<Blog> findByQuery(String query,Pageable pageable);
出现的问题

报错

 

解决:

@Override
public List<Blog> listRecommendBlogTop(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 中占位符参数绑定到控制器处理方法的入参中
————————————————

posted @ 2024-02-22 01:58  你今日食咗饭未  阅读(10)  评论(0)    收藏  举报