springboot jpa使用小结

springboot jpa使用小结

实体类注解

  • @Entity(name="表名")
  • @Id+@GeneratedValue 主键
  • @Column(name = "create_time", columnDefinition = " datetime(0) NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'") 指定列名、列类型、列描述
  • @Transient 该属性不是表中字段
  • @JsonInclude(JsonInclude.Include.NON_NULL) 空属性不映射到json
  • @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) 字段不映射到json

一对多

比如一个用户多个一行卡,user表中:

    @OneToMany(mappedBy = "fid", fetch = FetchType.EAGER)
    private List<Card> data;

fid是card表中的外键。fetch涉及到懒加载等方面的知识,遇错自明。

排序

    xx.findByPersonOrderByCreateTimeDesc(String person);//需要在repository中定义
    Sort sort = new Sort(Sort.Direction.DESC, "id");
    xxx.findAll(sort);//不需要再repository中定义就可以用

自定义sql

普通查询:

    @Query(value = "select * from xxx order by id desc limit 1", nativeQuery = true)

修改表记录:

    @Query(value = "UPDATE xxx SET x = ?1 WHERE y = ?2", nativeQuery = true)
    @Modifying
    void updateByLayers(String x, String y);//注意调用时要加事务注解@Transactional

批量查询:

    @Query(value = "SELECT id,create_time FROM Xxx WHERE id IN ?1", nativeQuery = true)
    List<Xxx> findXxxByIds(List<Integer> idList);

批量插入

    for(X x:list){
        xRepository.save(x);
    }

好吧,你看出来了,就是一个循环插入罢了,哈哈。

注意坑

  • repository中自定义方法,如果是修改数据库数据的,要加@Modifying注解,然后后面调用时最好加上@Transactional,不过具体回滚操作倒是看情况,一般简单的不用自己写。
  • hibernate.hbm2ddl.auto=createcreate每次都会删表重建,所以就别奇怪怎么数据丢了,一般用update,这样只会创建新增的表或者修改的字段,不容易丢数据。
  • hibernate.dialect方言也很重要,不过问某度就行了,出错了继续问,容易解决。
  • serverTimezone=GMT%2b8如果发现时间有问题,就在连接数据库的url后面加上这个,别问为什么是2b%,最多允许你改成大写的B。

猜你喜欢

转载自blog.csdn.net/m0_37659871/article/details/81318395