都說SpringDataJpa只適合單表,其實SptringDataJpa的缺陷就是不好優化查詢效率,但是如果對用戶量小的項目來着,SpringDataJpa還是挺好的。這方面知識還是比較少的,在這里做一個記錄。
我建四個表,把這四個表通過主外鍵管理。
enti
@Data @Entity @Table(name = "t_a") class A{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String aname; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "b_id") private B b; } @Data @Entity @Table(name = "t_b") class B{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String bname; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "c_id") private C c; } @Data @Entity @Table(name = "t_c") class C{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String cname; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "d_id") private D d; } @Data @Entity @Table(name = "t_d") class D{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String dname; }
建完之后是這樣的(模擬開發中的多表)

數據建好之后去創建對象A的mapper
public interface AMapper extends JpaRepository<A,Integer> , JpaSpecificationExecutor<A> { }

接下來給四個表添加一條數據,我就簡單點兒創了。由於springdatajpa的級聯,所以創建a表的數據就會把其他數據也填到對應的表中。
@SpringBootTest class DemoApplicationTests { @Autowired private AMapper mapper; @Test void contextLoads() { D d = new D(); d.setDname("ddd"); C c = new C(); c.setD(d); c.setCname("ccc"); B b = new B(); b.setC(c); b.setBname("bbb"); A a = new A(); a.setB(b); a.setAname("aaa"); mapper.save(a); } }
執行成功后進行一下查詢

然后我們假定一個場景,用d的dname屬性去查找a的數據。就用到了連接查詢了。

道理就是上圖這個樣子的,如果還有什么問題 可以留言給我
