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

mac2024-05-25  31

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

承接上篇博客:https://blog.csdn.net/qq_33608923/article/details/102792383 上篇主要讲了@ManyToMany和@OneToOne两个注解,遗留了一个问题,就是在实体关系为一对多或者多对多的时候,hibernate会先执行查询主表信息的一条sql,再根据主表外键查询副表的信息,这样就会执行1 + n条sql。 本篇来解决这个问题,Spring Data JPA引入了@NameEntityGraph注解:

import javax.persistence.*; import java.util.List; /** *Permission *author BenJerry *version 1.0 */ @NamedEntityGraph(name = "Permission.roles", attributeNodes = { @NamedAttributeNode("roles") }) @Table(name = "t_permission") @Entity public class Permission { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String permission; @ManyToMany @JoinTable(name = "t_role_permission", joinColumns = @JoinColumn(name = "pid", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "rid", referencedColumnName = "id")) private List<Role> roles; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getPermission() { return permission; } public void setPermission(String permission) { this.permission = permission; } public List<Role> getRoles() { return roles; } public void setRoles(List<Role> roles) { this.roles = roles; } }

在PermissionRepository中重写findAll方法:

import com.github.jpa.demo.entity.Permission; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; /** * PermissionRepository * author BenJerry * version 1.0 */ public interface PermissionRepository extends JpaRepository<Permission, Long> { @Override @EntityGraph(value = "Permission.roles") List<Permission> findAll(); }

实际执行的sql:

Hibernate: select permission0_.id as id1_1_0_, role2_.id as id1_2_1_, permission0_.permission as permissi2_1_0_, role2_.pid as pid2_2_1_, role2_.role as role3_2_1_, roles1_.pid as pid1_3_0__, roles1_.rid as rid2_3_0__ from t_permission permission0_ left outer join t_role_permission roles1_ on permission0_.id=roles1_.pid left outer join t_role role2_ on roles1_.rid=role2_.id

可以看到jpa一条sql就搞定了,使用的是left outer join,其中 @NamedAttributeNode这个注解可以写多个用以加入更多的表。

最新回复(0)