Spring data jpa使用细节及备忘事项

主要依赖:

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <scope>runtime</scope>

</dependency>

 

spring:

  jpa:

#配置数据库类型

    database: MySQL

# 指定生成表名的存储引擎为InnoDBD

    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

    show-sql: true

    hibernate:

      ddl-auto: update  //正向工程

#ddl-auto:create ----每次运行该程序,没有表格会新建表格,表内有数据会清空;
#ddl-auto:create-drop ----每次程序结束的时候会清空表
#ddl-auto:update ---- 每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
#ddl-auto: validate ---- 运行程序会校验数据与数据库的字段类型是否相同,不同会报错。

 @Id

 @GenericGenerator(name = "idGenerator", strategy = "uuid")  //定义主键生成策略

 @GeneratedValue(generator = "idGenerator") //设置主键生成策略

     简单主键设置策略:@GeneratedValue(strategy = GenerationType.IDENTITY)

JPA自带的几种主键生成策略

TABLE: 使用一个特定的数据库表格来保存主键

SEQUENCE: 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)

IDENTITY: 主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)

AUTO: 主键由程序控制,也是GenerationType的默认值

 

持久层:继承    JpaRepository: 基本查询

JpaSpecificationExecutor:多条件查询

CrudRepository:增删查改

PagingAndSortingRepository:在CrudRepository基础上增加了排序分页

Repository接口


命名规范:

①、不是随便声明的,而需要符合一定的规范
②、查询方法以 find | read | get 开头
③、涉及条件查询时,条件的属性用条件关键字连接
④、要注意的是:条件属性以首字母大写
⑤、支持属性的级联查询。若当前类有符合条件的属性,则优先使用,而不使用级联属性。若需要使用级联属性,则属性之间使用_连接


Query:

第一个By会被用作分隔符来指示实际查询条件:

支持一些基本的关键字查询 in,orderby(findByAgeOrderByLastnameDesc),

like(findByFirstnameLike) 等相关关键字查询功能

也支持限制查询:first ,top,distinct

查询正序排序排名第一的username

User findFirstByUsernameOrderByUsernameAsc(String username);

排名前10

List<User> findTop10ByUsername(String username, Sort sort);

排名前10的分页查询

List<User> findTop10ByUsername(String username, Pageable pageable);

@Query: jpql查询

应当注意参数顺序

@Query("select u from User u where u.email = ?1")

User getByEmail(String eamil);

此方法不需要注意参数顺序

@Query("select u from User u where u.id = :id")

User getById(@Param("id") String userId);

SPEL表达式>>>>从Spring Data JPA release 1.4开始,Spring Data JPA支持名为entityName的变量。 它的用法是select x from #{#entityName} x。entityName的解析方式如下:如果实体类在@Entity注解上设置了name属性,则使用它。 否则,使用实体类的简单类名。为避免在@Query注解使用实际的实体类名,就可以使用#{#entityName}进行代替。

@Query("select u from #{#entityName} u where u.email = ?1")

User getByEmail(String eamil);
原生sql查询,关键在于value=””,nativeQuery =true

@Query(value = "select * from tb_user u where u.email = ?1", nativeQuery = true)

User queryByEmail(String email);

分页查询,可以在方法参数中直接传入Pageable或Sort来完成动态分页或排序,通常Pageable或Sort会是方法的最后一个参数

@Query("select u from User u where u.username like %?1%")

Page<User> findByUsernameLike(String username, Pageable pageable);

 

@Query("select u from User u where u.username like %?1%")

List<User> findByUsernameAndSort(String username, Sort sort);

如涉及到修改、删除则需要再加上@Modifying注解

多表联合查询:

多对多:

 @ManyToMany(targetEntity = Role.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)

 @JoinTable(name="tb_user_role",joinColumns={@JoinColumn(name = "user_id", referencedColumnName = "id")},inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")})

    private Set<Role> roles;

异常:Spring Boot整合JPA后Hibernate的Session就交付给Spring去管理。每次数据库操作后,会关闭Session,当我们想要用懒加载方式去获得数据的时候,原来的Session已经关闭,不能获取数据,所以会抛出这样的异常


spring:

  jpa:

    open-in-view: true

    properties:

      hibernate:

        enable_lazy_load_no_trans: true

一对多,多对一:

 @OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.LAZY)

 

  @ManyToOne(targetEntity = Department.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)

 @JoinColumn(name = "dept_id")

慎用@Data注解,使用@Getter、@Setter注解,需要时自己重写toString()、equals()以及hashCode()方法


Auditing

Spring Data提供了@CreatedBy,@LastModifiedBy,@CreatedDate,@LastModifiedDate4个注解来记录表中记录的创建及修改信息。实体类上还添加了@EntityListeners(AuditingEntityListener.class),而AuditingEntityListener是由Spring Data Jpa提供的

实现AuditorAware接口

@Component

public class AuditorAwareImpl implements AuditorAware<String> {

    @Override

    public Optional<String> getCurrentAuditor() {

        return Optional.of("admin");

    }

}

这里简单的返回了一个"admin"字符串来代表当前用户名

在Spring Boot启动类上添加@EnableJpaAuditing注解用于启用Jpa的审计功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平常心丷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值