【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()); }
测试结果: