OJB查詢(二) (轉)
聯接:
在path expressions中(relationship.attribute)宣告的聯接在criteria中會被OJB自
動處理。Path expressions支援1:1,1:n,m:n多種關係。
下面的例子查詢屬於Liquors產品組的所有文章。文章和產品組的關係是在Article類中
的productGroup關係來建立的:
<!-- Definitions for org..ojb.ojb.broker.Article -->
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- OJB查詢(一) (轉)
- OJB簡介--翻至ojb docs (轉)
- 轉:C++實現的變種二分查詢法(折半查詢)--二叉查詢樹C++
- 查詢——二分查詢
- Python查詢-二分查詢Python
- 查詢演算法__二分查詢演算法
- 順序查詢和二分查詢
- 二分查詢(一)——純粹的二分查詢
- ElasticSearch的查詢(二)Elasticsearch
- 二、mybatis查詢分析MyBatis
- 標量子查詢(二)
- 二分查詢
- 查詢演算法之二分查詢演算法
- 查詢轉換
- Oracle查詢轉換(二)複雜檢視合併Oracle
- 二叉查詢樹的插入刪除查詢
- 【資料結構】折半查詢(二分查詢)資料結構
- 微策略面試題:在旋轉後的陣列中查詢元素(二分查詢)面試題陣列
- PHP二分查詢PHP
- 二分查詢法
- 二維陣列查詢陣列
- 查詢二叉樹二叉樹
- 二叉查詢樹
- 在應用程式中將OJB作為一個儲存層使用(二) (轉)
- 二分查詢 | 二分查詢的一種推薦寫法
- 第二章 :查詢與排序-------二分查詢的遞迴解法排序遞迴
- Oracle查詢轉換(五)子查詢展開Oracle
- 二分查詢【折半查詢】演算法 PHP 版演算法PHP
- Oracle 查詢轉換Oracle
- 閃回查詢(轉)
- 組合查詢 (轉)
- 二分查詢(c++)C++
- BinarySearch(二分查詢)
- 詳解二分查詢
- 704.二分查詢
- 二叉查詢樹(查詢、插入、刪除)——C語言C語言
- 牛客網 查詢(二分查詢、北郵機試)
- 陣列的查詢(搜尋):線性查詢和二分法查詢陣列