SpringBoot结合SpringData Jpa–注解部分(一)
承接上篇博客:https://blog.youkuaiyun.com/qq_33608923/article/details/102703848
简要说明:SpringData Jpa中有关实体类中的注解都是定义在javax.persistence.*这个包下面的,本篇主要说明的就是这些注解的使用。
首先,定义一个User的实体类:
@Table(name = "t_user")
@Entity
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String email;
private Long rid;
@OneToMany
@JoinColumn(name = "id", referencedColumnName = "rid")
private List<Role> roles;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Long getRid() {
return rid;
}
public void setRid(Long rid) {
this.rid = rid;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
}
@Entity注解是必须的,书上说是将实体类变成JPA管理的实体,据我观察,它的实际作用应该是可以被用于SpringEL的表达式(在repository中定义自定义的接口,需要写sql语句,这个语句不是原生的sql)。
@Table可以指定实体类对应的表名,因为实体类名往往与表名不一致。
@Id可以被用于findById这种方法。
第二步,创建UserRepository接口并继承CrudRepository:
import com.github.jpa.demo.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
/**
*UserRepository
*author BenJerry
*version 1.0
*/
public interface UserRepository extends CrudRepository<User, Long> {
@Query("select name from User where email = ?1")
String selectNameByEmail(String email);
@Query("select u from User u where email like %?1%")
Page<User> selectUserByPage(String email, Pageable pageable);
}
User是上一步创建的实体类,Long是User主键的类型。
第三步,在service中注入UserRepository并调用改接口继承的方法,也就是jpa提供给我们可以直接使用的方法:
@Autowired
private UserRepository userRepository;
@GetMapping(path = "/page1")
@ResponseBody
public Page<User> page1() {
return userRepository.selectUserByPage("1", PageRequest.of(0, 10));
}
repository不需要添加任何的注解就可以注入进来,这里我直接在controller层注入了,实际项目可能需要处理数据,所以一般注入到service层。
在User实体类中有@OneToMany注解,它默认是只有级联查询,另外还有cascade=CascadeType.PERSIST级联新建、CascadeType.REMOVE级联删除、CascadeType.REFRESH级联刷新、CascadeType.MERGE级联更新和CascadeType.ALL四项全有。
@JoinColumn(name = “id”, referencedColumnName = “rid”) name是Role里面的id字段,rid是User里面的rid字段
第四步,看下运行效果:
json:
{
"content": [{
"id": 1,
"name": "1",
"email": "1",
"rid": 1,
"roles": [{
"id": 1,
"role": "role1",
"pid": 1
}]
}],
"pageable": {
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"offset": 0,
"pageNumber": 0,
"pageSize": 10,
"unpaged": false,
"paged": true
},
"totalElements": 1,
"totalPages": 1,
"last": true,
"number": 0,
"size": 10,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"numberOfElements": 1,
"first": true,
"empty": false
}
控制台可以看到实际运行的sql:
Hibernate: select user0_.id as id1_4_, user0_.email as email2_4_, user0_.name as name3_4_, user0_.rid as rid4_4_ from t_user user0_ where user0_.email like ? limit ?
Hibernate: select roles0_.id as id1_2_0_, roles0_.id as id1_2_1_, roles0_.pid as pid2_2_1_, roles0_.role as role3_2_1_ from t_role roles0_ where roles0_.id=?