OJB查询(二)

原创 2003年09月23日 01:33:00

联接:

在path expressions中(relationship.attribute)声明的联接在criteria中会被OJB自

动处理。Path expressions支持1:1,1:n,m:n多种关系。

下面的例子查找属于Liquors产品组的所有文章。文章和产品组的关系是在Article类中

的productGroup关系来建立的:

<!-- Definitions for org.apache.ojb.ojb.broker.Article -->

   <class-descriptor

     class="org.apache.ojb.broker.Article"

     proxy="dynamic"

     table="Artikel"

   >

      ...

      <reference-descriptor

         name="productGroup"

         class-ref="org.apache.ojb.broker.ProductGroup"

      >

         <foreignkey field-ref="productGroupId"/>

      </reference-descriptor>

   </class-descriptor>

   <class-descriptor

     class="org.apache.ojb.broker.ProductGroup"

     proxy="org.apache.ojb.broker.ProductGroupProxy"

     table="Kategorien"

   >

  ...

      <field-descriptor

         name="groupName"

         column="KategorieName"

         jdbc-type="VARCHAR"

      />

      ...

   </class-descriptor>

path expressions包含了productGroup和groupName间1:1的关系

Criteria crit = new Criteria();

crit.addEqualTo("productGroup.groupName", "Liquors");

Query q = QueryFactory.newQuery(Article.class, crit);

Collection results = broker.getCollectionByQuery(q);

如果path expressions指向一个有限制的类,那么查询条件就变成了Ored。下面的例子

查询所有文章名以F开头的ProductGroups。Path expressions 声明了allArticlesInGr

oup来表示Articles的限制:Books和CDs:

Criteria crit = new Criteria();

crit.addLike("allArticlesInGroup.articleName", "F%");

Query q = QueryFactory.newQuery(ProductGroup.class, crit, true);

Collection results = broker.getCollectionByQuery(q);

SQL语句如下:

SELECT DISTINCT A0.KategorieName,A0.Kategorie_Nr,A0.Beschreibung

FROM Kategorien A0

INNER JOIN Artikel A1 ON A0.Kategorie_Nr=A1.Kategorie_Nr

LEFT OUTER JOIN BOOKS A1E0 ON A0.Kategorie_Nr=A1E0.Kategorie_Nr

LEFT OUTER JOIN CDS A1E1 ON A0.Kategorie_Nr=A1E1.Kategorie_Nr

WHERE A1.Artikelname LIKE  'F%'  OR

A1E0.Artikelname LIKE  'F%'  OR

A1E1.Artikelname LIKE  'F%'

Prefetched 关系:

能够使通过关系查询对象的查询次数最小化。在我们的测试中,我们指定ProductGroup

s和Articles有一对多的关系。当查询ProductGroups,通过一个查询获得ProductGroup

s,对于每个ProductGroup我们再通过查询获得它的Articles。

OJB试着通过prefetched关系将属于ProductGroups的所有Ariticles通过一个查询得到。

让我们来看看为什么一个查询基本上不能实现:

Criteria crit = new Criteria();

crit.addLessOrEqualThan("groupId", new Integer(5));

crit.addOrderByDescending("groupId");

crit.addPrefetchedRelationship("allArticlesInGroup");

Query q = QueryFactory.newQuery(ProductGroup.class, crit);

Collection results = broker.getCollectionByQuery(q);

第一个查询获得所有匹配的ProductGroups:

SELECT ... FROM Kategorien A0 WHERE

A0.Kategorie_Nr <= ? ORDER BY 3 DESC

第二个查询从第一个查询的结构中获得属于ProductGroups的Articles:

SELECT ... FROM Artikel A0 WHERE A0.Kategorie_Nr

IN ( ? , ? , ? , ? , ? ) ORDER BY 7 DESC

获得了所有相关的Articles后,该方法还不支持对关系使用Arrays。

查询对象:

OJB查询返回完全的对象,这就意味着所有的实例变量会被赋值,所有的自动获得关系会

被加载。到现在为止,还没有方法能够只获得部分的对象(如仅仅得到personde 的fir

stname和lastname)

Report查询:

Report查询适合获得一行数据,但是不使真正意义上的商业对象。一行数据就是一个对

象数组,通过这些查询你能够定义什么样的对象属性你希望在一行数据中存在。属性名

也可以包括path expressions如'owner.address.street'。可以使用ReportQuery#setC

olumns(String[] columns)来定义属性。注意:这里的columns不是数据库中的columns

,column的名字应该和查询中的属性名一样。

下面的ReportQuery总结了每个ProductGroup的库存文章数目和价格:

Criteria crit = new Criteria();

 

Collection results = new Vector();

ReportQueryByCriteria q = QueryFactory.newReportQuery(

                            ProductGroup.class, crit);

// define the 'columns' of the report

q.setColumns(new String[] { "groupName",

                            "sum(allArticlesInGroup.stock)",

                            "sum(allArticlesInGroup.price)" });

crit.addGroupBy("groupName");

Iterator iter = broker.getReportQueryIteratorByQuery(q);

OJB查询(一)

OJB查询 该文档介绍了不同查询机制的使用。文档中的代码都通过Junit测试过。 内容: 1. Query by criteria 2. ODMG Object Query Language(OQL)...
  • Emolasa
  • Emolasa
  • 2003年09月23日 01:33
  • 1055

Apache 门户项目组介绍

本文将快速浏览 Apache 门户项目组的所有项目,并着重介绍门户项目组中的核心项目-Jetspeed-2。 0 评论: 廖 健, 首席实施顾问 2006 年 11 月 ...
  • novelly
  • novelly
  • 2014年03月05日 14:56
  • 752

简单判断元素是否在二元组中

这里简单演示下:>>> a = ((1, 2), (3, 4))>>> print [i for i in a if 3 in(i)] and True or FalsTrue>>> print [i...
  • cnbird2008
  • cnbird2008
  • 2009年12月01日 17:52
  • 367

OJB简介--翻至ojb docs

简介: 对象关系桥(OJB)是一种对象关系映射工具,它能够完成从Java对象到关系数据库的透 明存储。 灵活性: OJB给用户提供了多种存储API,让用户有很多选择: 1. 提供完全的ODMG3.0 ...
  • Emolasa
  • Emolasa
  • 2003年09月23日 01:32
  • 1164

OJB(Apache)

......
  • xinlvye
  • xinlvye
  • 2013年10月13日 22:36
  • 398

OJB的缓存管理

OJB提供缓存接口ObjectCache 在ORM映射中配置如下:   ...   OJB二级缓存 ObjectCacheTwoLeve...
  • xingqinstar
  • xingqinstar
  • 2013年06月09日 21:43
  • 244

Using Lucene with OJB

November 23, 2004Search is important! All too often search looks like where thing like %that%. Us...
  • zery
  • zery
  • 2005年02月21日 16:16
  • 916

通达OA工作流应用实例,列表控件使用,二开设计查询页面

本实例介绍了工作流的表单设计和相关的css代码的编写; 工作流为任务申请单,发起人每天发起,任务明细写在列表控件中。 通过二次开发设计查询页面,查询页面包括查看本人的任务明细,部门领导查看本部门内所有...
  • hai7425
  • hai7425
  • 2017年01月22日 11:17
  • 963

hibernate和mybatis思想,区别,优缺点

Hibernate 简介 Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程...
  • huzhigenlaohu
  • huzhigenlaohu
  • 2016年05月28日 13:22
  • 1177

mysql select 语句查询排名

SELECT     obj.MEM_ID,     obj.count,     CASE WHEN @rowtotal = obj.count THEN     @rownum WHE...
  • zeroOneMan
  • zeroOneMan
  • 2016年07月12日 17:38
  • 243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OJB查询(二)
举报原因:
原因补充:

(最多只允许输入30个字)