SpringDataJpa多表聯查 用Specification動態查詢 實現多條件復雜查詢及多表聯查


都說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的數據。就用到了連接查詢了。

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM