我只是複製&粘貼one of my questions中的一些介紹性文本,因爲在這個問題中也包含同樣的表關係。基於特定條件檢索有關休眠中多對多映射的行
我有以下列出的Oracle(10g)數據庫中的許多表中的三個。我在Spring 3.0.2版本中使用Hibernate Tools 3.2.1.GA。
- 產品 - 父表
- 顏色 - 父表
- ProductColour - 連接表 - 分別爲
在表格引用colourId
和Colour
prodId
和Product
表ProductColour
是連接表Product
和Colour
之間。如表名暗示的那樣,Product
和Colour
之間存在多對多關係,其由PrductColour
映射。我認爲,數據庫中的關係可以很容易地想象出來,而且只有這麼多的信息纔是清楚的。因此,我不會不必要地探索這種關係。
在Product
的實體(行)與在Colour
在Colour
任何數量的實體和實體(行)也可以與在Product
任何數量的實體相關聯的相關聯。
由於,它是一個多到多的關係,它被映射在Product
和Colour
實體類(POJO)中與它們各自java.util.Set
和沒有直接POJO類爲product_colour
表是可用的。
類Product
如下所示。
public class Product implements java.io.Serializable
{
private BigDecimal prodId;
private Set<Colour> colours = new HashSet<Colour>(0);
.
.
.
//Other properties with setters and getters.
}
類Colour
看起來像下面這樣。
public class Colour implements java.io.Serializable
{
private BigDecimal colourId;
private Set<Product> products = new HashSet<Product>(0);
.
.
.
//Other properties with setters and getters.
}
實體之間的實際映射是xxx.hbm.xml
文件,對於這個問題這是不必要的。我想。
我想要做的是隻檢索從Colour
表不同時匹配特定產品在ProductColour
表色行的行。在這方面,本地Oracle SQL語句如下所示。
SELECT colour_id, colour_name, colour_hex
FROM colour
WHERE colour_id not in (SELECT colour_id FROM product_colour WHERE prod_id=81)
ORDER BY colour_id DESC
哪裏prod_id
可以在Java的任何有效BigDecimal
數量是動態的。
如前所述,這種關係在Hibernate中作爲多對多關係是可用的,數據庫表product_colour
沒有POJO類可用,因此我在Hibernate中編寫這樣的HQL語句時摸不着頭腦。我曾嘗試寫這樣的HQL語句,但沒有嘗試是成功的。
[在該部件的其餘部分呈現的代碼可以完全是不必要的,審查]
我因此以下以傳統方式。我在做什麼是...我首先從Product
基礎上,prodId
如動態值的實體類檢索的單品排,
List<Product>list=session.createQuery("from Product where prodId=:prodId")
.setParameter("prodId", prodId).list();
,然後使用一個循環,我獲得整個Colour
組 - java.util.Set
對應於Oracle中的product_colour
表,該表是在本產品如Product
實體可用,
Set<Colour>colours=new HashSet<Colour>(0);
for(Product p:list)
{
if(p!=null)
{
colours=p.getColours();
}
}
如可以看到的,所述colours
Set
被填充的所有顏色的行可用的(參考行)在Oracle中product_colour
表。
讓所有這些行後,我收到對應於甲骨文的colour
表整個Colour
實體類(在它所有的行),然後刪除那些符合從product_colour
甲骨文檢索的行的行表(在colours
設置在前面的代碼片段可用)滿足條件如前面提到的,如,
List<Colour>colourList=session.createQuery("from Colour order by colourId desc").list();
Iterator<Colour>it=colourList.iterator();
while(it.hasNext())
{
Colour c=(Colour)it.next();
for(Colour pc:colours) //colours is available in the preceding snippet.
{
if(c==pc)
{
it.remove();
}
}
}
這能做什麼打算,但這樣做,可能意味着在系統上的一些開銷。此外,我想實現似乎並不可能使用這種方法是分頁。我不能使用setFirstResult(int)
和setMaxResults(int)
方法來完成分頁是哪種情況,否則像下面關於Product
實體類所示的一個任務,
List<Product> products=session.createQuery("from product order by prodId desc")
.setMaxResults(0).setFirstResult(4);
所以,問題又是 ,對於這種關係,這可能寫出這樣的HQL語句只能檢索來自不匹配像上面所示天然SQL語句在product_colour
Oracle表色行Colour
實體類的行?
我如何能實現分頁的概念,否則(在的情況下,這是不可能的)?
它的工作。我忘了考慮加入。謝謝。 – Tiny