2013-04-24 71 views
0

這是我第一次開發Java應用程序並立即面臨問題。現在我有一個SQL查詢如下:在JPA中加入3個實體

Select PD.* From product PD 
join Stock SP on PD.id = SP.product_id 
join storage SR on SR.id = SP.storage_id 
join status ST on ST.storage_id = SR.id 
where ST.id ='1qa7n234i' 

我的實體:

public class Product extends MainEntity { 
    public Product(){} 
    public void setAtcKey(String pAtcKey) { 
    atcKey = pAtcKey; 
    } 
} 

public class StockPosition extends MainEntity { 
    public StockPosition(){} 
    @XmlIDREF 
    public Product getProduct() { 
     return product; 
    } 

    public void setProduct(Product pProduct) { 
     product = pProduct; 
    } 

    @XmlIDREF 
    public Storage getStorage() { 
     return storage; 
    } 

    public void setStorage(Storage pStorage) { 
     storage = pStorage; 
    } 
} 

public class Storage extends MainEntity { 
    public Storage(){} 
    @XmlTransient 
    public Station getStation() { 
    return station; 
    } 

    public void setStation(Station pStation) { 
    station = pStation; 
    } 
} 

public class Status extends MainEntity { 
    public Status(){} 
} 

所以我將它轉換爲CriteriaQuery中,如:

CriteriaBuilder cb = getCriteriaBuilder(); 
CriteriaQuery<Product> query = cb.createQuery(Product.class); 
Root<Product> product = query.from(Product.class); 
Join<StockPosition, Product> sp = product.join(StockPosition_.product); 

但我得到了像The method join(SingularAttribute<? super Product,Y>) in the type From<Product,Product> is not applicable for the arguments (SingularAttribute<StockPosition,Product>)錯誤消息?這個消息對我來說很奇怪(因爲我是新手)。謝謝

+0

你的意思是HQL查詢? – sanbhat 2013-04-24 11:35:39

+0

我正在使用:'javax.persistence.criteria.Join' – 2013-04-24 11:37:14

+0

您能否解釋更多並給我們更多詳細信息 – Khalil 2013-04-24 11:42:02

回答

-1

如果您有您的數據庫模型一到一個關係,那麼有一類和註釋像下面應該給你的結果。

基本上,您將獲取Stock,並獲得stock.storage.status(其中加入作爲每@javax.peristence.JoinColumn條款)

class Product { 

@OnetoOne 
@JoinColumn(name="product_id") 
Stock stock; 

} 

class Stock { 

@OnetoOne 
@JoinColumn(name="storage_id") 
Storage storage; 

} 

class Storage { 

@OnetoOne 
@JoinColumn(name="storage_id") 
Status status; 

} 
+0

謝謝,夥計,但是這種方式並沒有幫助: – 2013-04-24 11:52:38

1
CriteriaBuilder cb = getCriteriaBuilder(); 
CriteriaQuery<Product> query = cb.createQuery(Product.class); 
Root<Product> product = query.from(Product.class); 
Join<StockPosition, Product> sp = product.join(StockPosition_.product); 

我想應該是這樣的:

CriteriaBuilder cb = getCriteriaBuilder(); 
CriteriaQuery<Product> query = cb.createQuery(Product.class); 
Root<Product> product = query.from(Product.class); 
Join<StockPosition, Product> sp = product.join(Product_.stockposition); 

也許你用SQL連接的方式想了很多。

如果您不需要在運行時構建查詢,則可以考慮使用JPQL。

JPQL與NamedQueries: http://www.objectdb.com/java/jpa/query/named

也許這可以幫助您關於JPA 其他問題http://www.objectdb.com/java/jpa/query/criteria

你建立你自己的元模型類?或者您是否使用持久性框架提供的「元模型生成器」?

希望這會有所幫助。

0

您的連接不正確。如果您的RootProductRoot<Product>)中,則必須使用Product類中存在的屬性加入。

在這種情況下,您的Product類應該這樣定義的屬性:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH) 
private List<StockPosition> stackPositions; 

,然後執行如下連接:

Join<Product, StackPosition> sp = product.join(Product_.stackPositions_); 
Predicate p = cb.equal(sp.get(StackPosition_.id, "1qa7n234i"); 
...