Criteria实现多表查询

本文介绍了如何使用Hibernate Criteria API进行复合查询,并通过具体示例展示了如何在一个已有的查询基础上进一步添加条件来筛选结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感谢这个兄弟的资料 [url]http://www.blogjava.net/danxy2008/archive/2006/01/18/28437.html[/url]

自己的例子有点复杂,我就摘抄这位的吧

Criteria 可以進行複合查詢,即在原有的查詢基礎上再進行查詢,例如在 Room 對 User 的一對多關聯中,
在查詢出所有的 Room 資料之後,希望再查詢 users 中 "age" 為 30 的 user 資料:

Criteria roomCriteria = session.createCriteria(Room.class); 
Criteria userCriteria = roomCriteria.createCriteria("users");
userCriteria.add(Restrictions.eq("age", new Integer(30)));
List rooms = roomCriteria.list(); // 只列出 users 屬性中有 user 之 "age" 為 30 的 Room
Iterator iterator = rooms.iterator();


要说明的是,我用这个方法查出来的list结果是一个Object数组.数组中的元素为关联的2个对象.这是需要注意的,不然会报ClassCastException

补上自己的例子:

clss Person{
private Integer id;
private String name;
private Date birthday;
private Set addresses = new HashSet(0);
....
}
class Address{
private Integer addressid;
private Person person;
private String homeaddress;
private String companyaddress;
}
Criteria criteria = test.session.createCriteria(Person.class).createCriteria("addresses").add(Restrictions.eq("addressid", 1));
List list = criteria.list();

运行后sql如下:
Hibernate:
select this_.id as id0_1_, this_.name as name0_1_, this_.birthday as birthday0_1_, address1_.addressid as addressid1_0_, address1_.personid as personid1_0_, address1_.homeaddress as homeaddr3_1_0_, address1_.companyaddress as companya4_1_0_ from test.person this_ inner join test.address address1_ on this_.id=address1_.personid where address1_.addressid=?

且结果为Person数组,不同于上次实践的结果,不知道是什么原因.

个人觉得应该还有其他方法,等会了再补充上来
### MyBatis Criteria 联查示例 #### 使用MyBatis Criteria实现联合查询 为了展示如何利用MyBatis的Criteria功能来执行复杂的连接查询操作,下面提供了一个具体的例子。假设存在三个实体类`Living`, `Actor`, 和`UserDetail`以及它们之间的关系。 ```java // Living.java public class Living { private Integer id; private Actor actor; // getters and setters... } // Actor.java public class Actor { private Integer id; private UserDetail userDetail; // getters and setters... } // UserDetail.java public class UserDetail { private String sex; // other fields, getters and setters... } ``` 对应的Mapper接口定义如下: ```java import org.apache.ibatis.annotations.*; import java.util.List; @Mapper public interface LivingMapper { @SelectProvider(type=SqlBuilder.class, method="buildQuery") List<Living> queryLivings(); public static class SqlBuilder{ public String buildQuery(){ return new SQL(){{ SELECT("*"); FROM("living l"); LEFT_OUTER_JOIN("actor a ON l.actor_id=a.id"); LEFT_OUTER_JOIN("user_detail ud ON a.user_detail_id=ud.id"); WHERE("l.status='active'"); }}.toString(); } } } ``` 上述代码片段展示了怎样构建一个关联的选择语句[^1]。这里使用了SQL Builder模式配合MyBatis内置的支持动态SQL的能力,使得编写复杂查询变得更加直观易懂。对于每张间的联系,则采用了左外连接(`LEFT OUTER JOIN`)的方式确保即使某些记录缺少对应的数据也能被正确获取到。 当涉及到更条件筛选或者其他类型的JOIN时,可以根据实际需求调整WHERE子句和其他部分的内容。此外,如果希望进一步简化配置并提高开发效率,还可以考虑引入MyBatis Plus这样的扩展库[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值