1. 程式人生 > 實用技巧 >【Spring Data JPA】10 物件導航查詢

【Spring Data JPA】10 物件導航查詢

定義:

查詢一個記錄時,也就是查詢這個物件,通過這個物件查詢他的關聯物件

【說白了不就是從我們設定好的集合中獲取不就完了嗎】

環境搭建:

INSERT INTO `jpa`.`cst_customer` (`cust_name`) VALUES ('傳智部落格'); 
INSERT INTO `jpa`.`cst_linkman` (`lkm_name`) VALUES ('張三');
INSERT INTO `jpa`.`cst_linkman` (`lkm_name`) VALUES ('李四'); 
INSERT INTO `jpa`.`cst_linkman` (`lkm_name`) VALUES
('王五'); UPDATE `jpa`.`cst_linkman` SET `lkm_cust_id` = '1' WHERE `lkm_id` = '1'; UPDATE `jpa`.`cst_linkman` SET `lkm_cust_id` = '1' WHERE `lkm_id` = '2'; UPDATE `jpa`.`cst_linkman` SET `lkm_cust_id` = '1' WHERE `lkm_id` = '3';

測試執行:

    @Test
    @Transactional
    @Rollback(false) // 設定不自動回滾
    public
void query(){ Specification<Customer> customerSpecification = (Specification<Customer>) (root, criteriaQuery, criteriaBuilder) -> { // 獲取比較的屬性 Path<Object> cust_id = root.get("custId"); // 模糊要求指定引數型別 return criteriaBuilder.equal(cust_id, 1); }; Optional
<Customer> customerOptional = customerRepository.findOne(customerSpecification); Customer customer = customerOptional.get(); System.out.println(customer.getCustName()); Set<LinkMan> linkmans = customer.getLinkmans(); for (LinkMan linkman : linkmans) { System.out.println(linkman.getLkmName()); } }

測試結果:

傳智部落格
張三
李四
王五

懶載入查詢的問題:

又稱延遲載入,簡單點意思就是不會立即執行查詢,當指標的引用沒有呼叫

是不會加載出來賦值的。

作用於XXXRepository的GetOne方法:

customerRepository.getOne

我們也可以自己手動配置更改載入行為:

該列舉就兩種屬性,EAGER & LAZY

相反的,從多記錄的一方查詢對應一個記錄也是可以的

    @Test
    @Transactional
    @Rollback(false) // 設定不自動回滾
    public void query2(){
        
        Optional<LinkMan> linkManOptional = linkManRepository.findOne((Specification<LinkMan>) (root, criteriaQuery, criteriaBuilder) -> {
            Path<Object> path = root.get("lkmId");
            return criteriaBuilder.equal(path, 2);
        });

        LinkMan linkMan = linkManOptional.get();
        Customer customer = linkMan.getCustomer();

        System.out.println(customer.getCustName());
    }

測試結果: