SpringBoot结合SpringData Jpa--注解部分(一)

SpringBoot结合SpringData Jpa–注解部分(一)

承接上篇博客:https://blog.csdn.net/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=?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值