• 使用Spring-data-jpa


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

    jpa querydsl  多表的联合查询

    导入依赖 querydsl-jpa  、querydsl-apt

    Repository接口, 继承QuerydslPredicateExecutor接口

    1. @NoRepositoryBean
    2. public interface BaseMongoRepository extends MongoRepository, QuerydslPredicateExecutor {
    3. }

    继承BaseMongoRepository方法

    1. @Repository
    2. public interface UserRepository extends BaseMongoRepository {
    3. }

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

    Type Tag Blog User Comment

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

    1. public class Type { //Type为被拥有方
    2. @OneToMany(mappedBy = "type")
    3. private List blogs = new ArrayList<>();
    4. }
    1. public class Blog {//拥有方
    2. @ManyToOne
    3. private Type type;
    4. }

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

    我的版本:2.3.4.RELEASE
    

            // SpringBoot2.0版本就没有这个方法 findOne()方法

    1.5.7.RELEASE 才有
    
    也没有delete() 改成deleteById()
    1. @Override
    2. public Blog getBlog(Long id) {
    3. //blogRepository.findOne(id);报错原因
    4. return blogRepository.findById(id).orElse(null);
    5. }

    组合查询 动态查询

    Repository继承JpaSpecificationExecutor 

    blogRepository.findAll();  (Example,Pageable)

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

    findAll(Specification spec, Pageable pageable);

    1. @Override
    2. public Page listBlog(Pageable pageable, Blog blog) {
    3. //组合查询
    4. return blogRepository.findAll(new Specification(){
    5. // root 对象 CriteriaQuery 查询条件容器 CriteriaBuilder 表达式
    6. @Override
    7. public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) {
    8. List predicates = new ArrayList<>();
    9. if (!"".equals(blog.getTitle()) && blog.getTitle() != null){//判断不为空
    10. //title模糊查询
    11. //放进条件集合 Predicate 作为一个对象封装条件 like(<类型>属性名,值 相当于拼接sql);
    12. predicates.add(cb.like(root.get("title"),"%"+blog.getTitle()+"%"));
    13. }
    14. if (blog.getType().getId() != null){
    15. //type模糊查询
    16. predicates.add(cb.equal(root.get("type").get("id"),blog.getType().getId()));
    17. }
    18. if (blog.isRecommend()){
    19. //是否推荐
    20. predicates.add(cb.equal(root.get("recommend"),blog.isRecommend()));
    21. }
    22. //list转数组
    23. cq.where(predicates.toArray(new Predicate[predicates.size()]));
    24. return null;
    25. }
    26. },pageable);
    27. }
    • Predicate
      是 JPA 协议⾥⾯提供的查询条件的根基
    • Root root
              实体对象的根 root.get(String name)得到操作的字段
    • CriteriaQuery cq
             相当于装查询条件的容器 
    • CriteriaBuilder cb
             相当于表达式

    最后是调⽤的 EntityManager 

    1. // select b from Blog b where b.title like %内容%
    2. @Query("select b from Blog b where b.title like ? 1 or b.content like ?1") // ?1 代表第一个参数 ?2 第二个参数
    3. Page findByQuery(String query,Pageable pageable);

    出现的问题

    报错

    解决:

    1. @Override
    2. public List listRecommendBlogTop(Integer size) {
    3. Sort sort = Sort.by(Sort.Direction.DESC,"updateTime");
    4. Pageable pageable = PageRequest.of(0,size,sort);
    5. return blogRepository.findTop(pageable);
    6. }

    出现的问题

    IllegalArgumentException: Could not resolve placeholder in string value

    1. @Value("${comment.avatar}")
    2. 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 中占位符参数绑定到控制器处理方法的入参中

  • 相关阅读:
    HCNP Routing&Switching之RSTP保护
    2023 年 亚太赛 APMCM ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析
    IDEA热部署插件JRebel and XRebel
    数据资产时代来临,如何激活第一方客户数据?
    文本语义表征(Sentence-Bert、Simcse)的应用和实践
    Go的数据结构(感谢韩老师)
    golang反射
    【Spring Cloud】openfeign负载均衡方案(和lb发展历史)
    正则表达式
    led灯什么牌子的质量好又耐用?2022性价比高的led护眼灯品牌推荐
  • 原文地址:https://blog.csdn.net/LUOZONGW/article/details/132587421