博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringDataJPA 多表查询 对象导航查询
阅读量:6214 次
发布时间:2019-06-21

本文共 2206 字,大约阅读时间需要 7 分钟。

hot3.png

Spring Data JPA中的多表查询

1对象导航查询

对象图导航检索方式是根据已经加载的对象,导航到他的关联对象。它利用类与类之间的关系来检索对象。例如:我们通过ID查询方式查出一个客户,可以调用Customer类中的getLinkMans()方法来获取该客户的所有联系人。对象导航查询的使用要求是:两个对象之间必须存在关联关系。

查询一个客户,获取该客户下的所有联系人

@Autowired	private CustomerDao customerDao;		@Test	@Transactional	public void testFind() {		Customer customer = customerDao.findOne(5l);		Set
linkMans = customer.getLinkMans();//对象导航查询 for(LinkMan linkMan : linkMans) { System.out.println(linkMan); } }

查询一个联系人,获取该联系人的所有客户

@Autowired	private LinkManDao linkManDao;			@Test	public void testFind() {		LinkMan linkMan = linkManDao.findOne(4l);		Customer customer = linkMan.getCustomer(); //对象导航查询		System.out.println(customer);	}

对象导航查询的问题分析

问题1:我们查询客户时,要不要把联系人查询出来?

分析:如果我们不查的话,在用的时候还要自己写代码,调用方法去查询。如果我们查出来的,不使用时又会白白的浪费了服务器内存。

解决:采用延迟加载的思想。通过配置的方式来设定当我们在需要使用时,发起真正的查询。

配置方式:

/** * 在客户对象的@OneToMany注解中添加fetch属性 * 		FetchType.EAGER	:立即加载 * 		FetchType.LAZY	:延迟加载 */@OneToMany(mappedBy="customer",fetch=FetchType.EAGER)private Set
linkMans = new HashSet<>(0);

问题2:我们查询联系人时,要不要把客户查询出来?

分析:例如:查询联系人详情时,肯定会看看该联系人的所属客户。如果我们不查的话,在用的时候还要自己写代码,调用方法去查询。如果我们查出来的话,一个对象不会消耗太多的内存。而且多数情况下我们都是要使用的。

解决: 采用立即加载的思想。通过配置的方式来设定,只要查询从表实体,就把主表实体对象同时查出来

配置方式

/**	 * 在联系人对象的@ManyToOne注解中添加fetch属性	 * 		FetchType.EAGER	:立即加载	 * 		FetchType.LAZY	:延迟加载	 */	@ManyToOne(targetEntity=Customer.class,fetch=FetchType.EAGER)	@JoinColumn(name="cst_lkm_id",referencedColumnName="cust_id")	private Customer customer;

2使用Specification查询

/**	 * Specification的多表查询	 */	@Test	public void testFind() {		Specification
spec = new Specification
() { public Predicate toPredicate(Root
root, CriteriaQuery
query, CriteriaBuilder cb) { //Join代表链接查询,通过root对象获取 //创建的过程中,第一个参数为关联对象的属性名称,第二个参数为连接查询的方式(left,inner,right) //JoinType.LEFT : 左外连接,JoinType.INNER:内连接,JoinType.RIGHT:右外连接 Join
join = root.join("customer",JoinType.INNER); return cb.like(join.get("custName").as(String.class),"传智播客1"); } }; List
list = linkManDao.findAll(spec); for (LinkMan linkMan : list) { System.out.println(linkMan); } }

转载于:https://my.oschina.net/edisonOnCall/blog/3033360

你可能感兴趣的文章
document.compatMode属性
查看>>
Servlet学习笔记
查看>>
CyclicBarrier的应用场景
查看>>
20172318 《程序设计与数据结构》第三周学习总结
查看>>
Windows下安装phpRedis扩展
查看>>
在Visual Studio中将现有.NET Framework项目迁移至.NET Core 1.1 Preview 1
查看>>
电子商城实录------载入数据库模型
查看>>
为什么在vue的组件中,data要用function返回对象呢?
查看>>
使用selenium模拟登陆点击登陆按钮
查看>>
ligerui tab 部分记载
查看>>
Service服务
查看>>
1060. Are They Equal (25)
查看>>
win10在当前目录下 打开cmd
查看>>
jquery.extend 与 jquery.fn.extend的区别和使用
查看>>
NFS存储服务器的部署流程
查看>>
计算机网络术语总结2
查看>>
一个超简单的马里奥游戏
查看>>
DLRS(深度学习应用于推荐系统论文汇总--2017年8月整理)
查看>>
c setjmp longjmp
查看>>
SQL函数大全
查看>>