腾飞工作室

SpringDataJPA 全解

spring data jpa 使用教程

常见注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Entity:表示该类对应一个数据库表实体类;
@Table: 定义该实体类所对应的数据库表名,该注解非必需,只要实体类名能够与数据库表名称对应即可;
@Id + @GeneratedValue:表示属性id为主键唯一标志,且是一个自增字段;
@Enumerated:实体类的属性类型可以是枚举类型。该例中,通过注解@Enumerated说明bizCode属性为BizCodeEnum枚举类型。这样在存储或者查询时,可自动进行解析。在实体中虽然标注成枚举类型,但当实体持久化后,表中所对应的值仍旧是基本的数据类型。由于枚举类型有名称和值两个属性,在持久化时可以选择持久化值或者名称。EnumType.STRING表示该属性持久化类型为枚举类名称属性。同时,EnumType.ORDINAL表示持久化类型为枚举类值属性(默认)。
@Column:设置属性对应的字段信息。包括字段名称、是否可空等等。
@OneToMany + @JoinColumn + @ManyToOne:当表之间,存在一对多关系时可以使用;
@ManyToMany + @JoinTable + @ManyToMany:多对多的情况;
@OneToOne + @OneToOne:一对一外键映射关系;
@Transient:瞬时字段 :不需要与数据库映射的字段,在保存的时候不需要保存倒数据库;
@JsonFormat:可以方便的把Date类型直接转化为我们想要的模式,比如@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")
大字段:
@Lob //对应Blob字段类型
@Column(name = "PHOTO")
private Serializable photo;
@Lob //对应Clob字段类型
@Column(name = "desc")
private String desc;

通过解析方法名创建查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在上述的例子中,我们也自定义了一些查询方法,如findByBizCode,代表通过bizCode字段值来进行查询。同时还可以利用And进行多字段条件查询,如findByBusinessIdAndFollowUpId等。
在查询时,通常需要同时根据多个属性进行查询,且查询的条件也格式各样(大于某个值、在某个范围等等),Spring Data JPA 为此提供了一些表达条件查询的关键字,大致如下:
And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);
Or --- 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);
Between --- 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min);
LessThan --- 等价于 SQL 中的 "<",比如 findBySalaryLessThan(int max);
GreaterThan --- 等价于 SQL 中的">",比如 findBySalaryGreaterThan(int min);
IsNull --- 等价于 SQL 中的 "is null",比如 findByUsernameIsNull();
IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByUsernameIsNotNull();
NotNull --- 与 IsNotNull 等价;
Like --- 等价于 SQL 中的 "like",比如 findByUsernameLike(String user);
NotLike --- 等价于 SQL 中的 "not like",比如 findByUsernameNotLike(String user);
OrderBy --- 等价于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user);
Not --- 等价于 SQL 中的 "! =",比如 findByUsernameNot(String user);
In --- 等价于 SQL 中的 "in",比如 findByUsernameIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
NotIn --- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;

自定义sql查询

通过使用@Query注解,我们可以使用sql自定义查询。同时也可以实现一些复杂的查询。例子如下:

/**
     * 使用sql语言查询符合businessType字段要求的行数
     * @param businessType
     * @return
     */
    @Query("SELECT count(t) FROM #{#entityName} t  where t.businessType = ?1")
    Object queryCountByBusinessType(int businessType);

#{#entityName}:使用#{#entityName}标识与实体类对应的要查询的表名;

?1:查询参数的使用。?1代表一个参数的占位符。
除此之外,还可以通过通过: 变量的格式来指定参数,同时在方法的参数前面使用 @Param 将方法参数与sql中的命名参数对应,如下:
@Query("SELECT count(t) FROM #{#entityName} t  where t.businessType = :businessType")
    Object queryCountByBusinessType(@Param("businessType") int businessType);

配置扫描实体和仓库

在spring boot入口类上声明就行

1
2
3
4
5
6
7
8
9
10
11
12
@EntityScan("com.ali.crm.entity")
@EnableJpaRepositories("com.ali.crm.repository")
@ComponentScan(basePackages="com.ali.crm")
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

本文出自 “腾飞工作室” 博客,请务必保留此出处:http://tfgzs.net/2016/05/31/SpringDataJPA全解/