hibernateCriteria关联查询
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
hibernateCriteria关联查询
hibernate Criteria 关联查询
0、配置文件增加property-ref
1、测试通过Criteria查询关联表;
2、查询策略外连接;
3、通过外键关联查询;
4、配置文件增加inverse=true
// Criteria查询语句的补充
// 一、复合查询
// 在这个一对多的例子中。
我们使用复合查询,查询所有用户及其地址。
// Criteria criteria = session.createCriteria(User.class);
// List list = criteria.list();
//
// for (int i = 0; i < list.size(); i++) {
// User user = (User) list.get(i);
// System.out.println("\t user:"+i+" name is:" + user.getNam e());
//
// Set addrSet = user.getAddresses();
// Iterator it = addrSet.iterator();
// while(it.hasNext()){
// Address addr = (Address)it.next();
// System.out.println("\t\t user:"+i+" address is:"+addr.getA ddress());
// }
// }
// 通过Criteria查询条件,我们可以查询位于上海的用户
// Criteria criteria = session.createCriteria(User.class);
//
// Criteria addCriteria =
// criteria.createCriteria("addresses");//这里addresses和User 类对应
// addCriteria.add(Expression.like("address",
// "%shanghai%"));//这里构造新的Criteria查询过滤条件
// List list = criteria.list();
//
// for (int i = 0; i < list.size(); i++) {
// User user = (User) list.get(i);
// System.out.println("\t user:" + i + " name is:" + user.getN ame());
//
// Set addrSet = user.getAddresses();
// Iterator it = addrSet.iterator();
// while (it.hasNext()) {
// Address addr = (Address) it.next();
// System.out.println("\t\t user:" + i + " address is:"
// + addr.getAddress());
// }
// }
/zj%5Fchen/blog/item/35631384eb2f74 3267096e96.html
4. 关联
你可以使用createCriteria()非常容易的在互相关联的实体间建立约束。
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.createCriteria("kittens")
.add( Restrictions.like("name", "F%")
.list();
注意第二个createCriteria()返回一个新的Criteria实例,该实例引用kittens 集合中的元素。
接下来,替换形态在某些情况下也是很有用的。
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add( Restrictions.eqProperty("", "") )
.list();
(createAlias()并不创建一个新的 Criteria实例。
)
Cat实例所保存的之前两次查询所返回的kittens集合是没有被条件预过滤的。
如果你希望只获得
符合条件的kittens,你必须使用returnMaps()。
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Restrictions.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Cat kitten = (Cat) map.get("kt");
}
假设有两个表parent,child ,父子关系,一对多的关系,在xml 文件中配置了关联关系,
<set nas="childs" inverse="true" lazy="true">
<key column="parentId">
<one-to-many class="child">
</set>
我在查询父亲列表中加了儿子的限制条件
criteria.createAlias("childs","childs");
criteria.add(Restrictions.eq("", "ceshi"));
这样为什么得到的父亲列表中,包含所有的儿子呢,感觉这个条件好像没有,但是hibernate生成的sql语句是正确的。
离线(detached)查询和子查询
DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。
DetachedCriteria query = DetachedCriteria.forClass(Cat.class) .add( Property.forName("sex").eq('F') );
//创建一个Session
Session session = .;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
mit();
session.close();
DetachedCriteria也可以用以表示子查询。
条件实例包含子查询可以通过 Subqueries或者Property获得。
DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
.setProjection( Property.forName("weight").avg() );
session.createCriteria(Cat.class)
.add( Property.forName("weight).gt(avgWeight) )
.list();
DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
.setProjection( Property.forName("weight") );
session.createCriteria(Cat.class)
.add( Subqueries.geAll("weight", weights) )
.list();
相互关联的子查询也是有可能的:
DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")
.setProjection( Property.forName("weight").avg() )
.add( Property.forName("cat2.sex").eqProperty("cat.sex") );
session.createCriteria(Cat.class, "cat")
.add( Property.forName("weight).gt(avgWeightForSex) )
.list();
5. 动态关联抓取
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.setFetchMode("kittens", FetchMode.EAGER)
.list();
这个查询可以通过外连接抓取mate和kittens。