OJB查詢(二) (轉)

gugu99發表於2007-08-17
OJB查詢(二) (轉)[@more@]

聯接:

在path expressions中(relationship.attribute)宣告的聯接在criteria中會被OJB自

動處理。Path expressions支援1:1,1:n,m:n多種關係。

下面的例子查詢屬於Liquors產品組的所有文章。文章和產品組的關係是在Article類中

的productGroup關係來建立的:

<!-- Definitions for org..ojb.ojb.broker.Article --&gt

 

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

  ="dynamic"

  table="Artikel"

  >

  ...

 

  name="productGroup"

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

  >

 

 

 

 

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

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

  table="Kategorien"

  >

  ...

 

  name="groupName"

  column="KategorieName"

  jc-type="VARCHAR"

  />

  ...

 

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);

語句如下:

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);


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963462/,如需轉載,請註明出處,否則將追究法律責任。

相關文章