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 = "select * from xxx where id in ?1", nativeQuery = true)
List<Xxx> findByIdList(List<Integer> list);
修改表记录:
@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=create
create每次都会删表重建,所以就别奇怪怎么数据丢了,一般用update,这样只会创建新增的表或者修改的字段,不容易丢数据。hibernate.dialect
方言也很重要,不过问某度就行了,出错了继续问,容易解决。serverTimezone=GMT%2b8
如果发现时间有问题,就在连接数据库的url后面加上这个,别问为什么是2b%
,最多允许你改成大写的B。