Hibernate 连接查询

使用HQL进行连接查询。

Hibernate应用中,实体类的关联关系已经在hbm.xml中进行了配置,HQL中的连接查询分为隐式(implicit)和显示(explicit)两种。

1、隐式连接查询

隐式连接查询不使用join关键字,默认是inner join的规则,即内连接。

测试基于one-to-one关系的隐式连接查询:

String hql1 = "select p from People p where p.passport.expiry=6";
List<People> list = session.createQuery(hql1).list();
for(People p:list){
	System.out.println(p.getId()+" "+p.getName());
}

一对多关系的隐式查询:

String hql2 = "select p from Person p where size(p.addresses)>1";
List<Person> list = session.createQuery(hql2).list();
for(Person p:list){
	System.out.println(p.getName());
}


2、显示连接查询

与SQL语言类似,HQL中的显示连接查询也有三种,及inner join、left outer join和right outer join,含义也有SQL中的关联查询类似。

可以简写成join、left join和right join。

String hql1 = "select p from People p join p.passport passport where passport.expiry=6";
List<People> list = session.createQuery(hql1).list();
for(People p:list){
	System.out.println(p.getId()+" "+p.getName());
}
测试左外连接的显示查询:

String hql2 = "select p from People p left join p.passport passport";
List<People> list = session.createQuery(hql2).list();
for(People p:list){
	System.out.println(p.getId()+" "+p.getName());
}
测试右外连接的显示查询:

String hql3 = "select p from People p right join p.passport passport";
List<People> list = session.createQuery(hql3).list();
for(People p:list){
	System.out.println(p.getId()+" "+p.getName());
}
在一对多关联关系中也可以使用显示连接查询:

String hql4 = "select p from Person p left join p.addresses addresser where addresses is null";
List<Person> list = session.createQuery(hql4).list();
for(Person p:list){
	System.out.println(p.getName());
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate 中,可以使用 HQL 或者 Criteria API 来进行内外连接查询。 1. 内连接查询连接查询可以使用 HQL 或者 Criteria API 来实现。以下是 HQL 的示例: ```java String hql = "select c.name, o.orderNumber from Customer c inner join c.orders o where c.name like '%John%'"; Query query = session.createQuery(hql); List<Object[]> results = query.list(); for(Object[] row : results) { String customerName = (String) row[0]; String orderNumber = (String) row[1]; // do something with the result } ``` 以上 HQL 查询使用了 `inner join` 关键字。在这里,我们查询了所有名字包含 "John" 的客户及其所有订单号。 以下是 Criteria API 的示例: ```java CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<Object[]> query = builder.createQuery(Object[].class); Root<Customer> customer = query.from(Customer.class); Join<Customer, Order> order = customer.join("orders", JoinType.INNER); query.multiselect(customer.get("name"), order.get("orderNumber")); query.where(builder.like(customer.get("name"), "%John%")); List<Object[]> results = session.createQuery(query).getResultList(); for(Object[] row : results) { String customerName = (String) row[0]; String orderNumber = (String) row[1]; // do something with the result } ``` 以上 Criteria API 查询使用了 `join` 方法,并指定了 `JoinType.INNER` 来进行内连接查询。在这里,我们查询了所有名字包含 "John" 的客户及其所有订单号。 2. 外连接查询连接查询同样可以使用 HQL 或者 Criteria API 来实现。以下是 HQL 的示例: ```java String hql = "select c.name, o.orderNumber from Customer c left join c.orders o"; Query query = session.createQuery(hql); List<Object[]> results = query.list(); for(Object[] row : results) { String customerName = (String) row[0]; String orderNumber = (String) row[1]; // do something with the result } ``` 以上 HQL 查询使用了 `left join` 关键字。在这里,我们查询了所有客户及其所有订单号,如果客户没有订单则订单号为 null。 以下是 Criteria API 的示例: ```java CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<Object[]> query = builder.createQuery(Object[].class); Root<Customer> customer = query.from(Customer.class); Join<Customer, Order> order = customer.join("orders", JoinType.LEFT); query.multiselect(customer.get("name"), order.get("orderNumber")); List<Object[]> results = session.createQuery(query).getResultList(); for(Object[] row : results) { String customerName = (String) row[0]; String orderNumber = (String) row[1]; // do something with the result } ``` 以上 Criteria API 查询同样使用了 `join` 方法,并指定了 `JoinType.LEFT` 来进行左外连接查询。在这里,我们查询了所有客户及其所有订单号,如果客户没有订单则订单号为 null。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值