2012-11-14 36 views
0

我只是複製&粘貼one of my questions中的一些介紹性文本,因爲在這個問題中也包含同樣的表關係。基於特定條件檢索有關休眠中多對多映射的行


我有以下列出的Oracle(10g)數據庫中的許多表中的三個。我在Spring 3.0.2版本中使用Hibernate Tools 3.2.1.GA。

  1. 產品 - 父表
  2. 顏色 - 父表
  3. ProductColour - 連接表 - 分別爲

在表格引用colourIdColourprodIdProductProductColour連接表ProductColour之間。如表名暗示的那樣,ProductColour之間存在多對多關係,其由PrductColour映射。我認爲,數據庫中的關係可以很容易地想象出來,而且只有這麼多的信息纔是清楚的。因此,我不會不必要地探索這種關係。

Product的實體(行)與在ColourColour任何數量的實體和實體(行)也可以與在Product任何數量的實體相關聯的相關聯。


由於,它是一個多到多的關係,它被映射在ProductColour實體類(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(); 
    } 
} 

如可以看到的,所述coloursSet被填充的所有顏色的行可用的(參考行)在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實體類的行?

我如何能實現分頁的概念,否則(在的情況下,這是不可能的)?

回答

1

簡短的回答到veeeeery長的問題:

select colour from Colour colour 
where colour.id not in (
    select colour2.id from Product product 
    inner join product.colours colour2 
    where product.id = :productId) 
+0

它的工作。我忘了考慮加入。謝謝。 – Tiny