2012-07-24 106 views
1

如何獲得JPA & JPQL將完整的連接查詢傳遞給RDBMS?例如,JPQL表連接查詢

SELECT e 
FROM Employee e 
WHERE a.runkey = e.runkey 
    AND e.middle = 'M' 
    AND a.state = 'MA' 

用下面的Employee類

@Entity 
public class Employee implements Serializable { 

    blah ... blah 

    @OneToOne 
    @JoinColumn(
    name = "runkey", 
    referencedColumnName = "runkey", 
    insertable=false, updatable=false) 
    private Address address; 
} 

和JPQL,

SELECT e 
FROM Employee e 
INNER JOIN FETCH e.address AS a 
WHERE a.state = :state 
AND e.middle = :middle 

我能夠得到Hibernate的JPA提取數據符合市場預期。

但是,eclipselink聲稱它無法遍歷關聯字段「地址」。

如果是這樣,那麼應該如何設計Employee實體,以及如何使用JPQL來使eclipselink執行與兩個表上的WHERE過濾器的表連接?

(咆哮:否則的EclipseLink JPA沒有比JDO更好!)

進一步編輯:這是否意味着後什麼我的情況....
https://forums.oracle.com/forums/thread.jspa?threadID=1568659

+0

什麼是'N' ?什麼是異常(複製你的堆棧跟蹤)? JOIN FETCH應該可以工作。 – 2012-07-24 22:35:44

+0

不是n,但e - 更正。 – 2012-07-24 22:42:06

+0

「JOIN FETCH應該工作」 - 僅適用於Hibernate JPA或未過濾的eclipselink。當我將供應商更改爲eclipselink時,由於eclipselink不允許我在相關字段上進行過濾,因此失敗。 – 2012-07-24 22:46:15

回答

1

問題是,您正試圖根據JPQL規範嘗試別名不允許的聯合抓取。無論如何,Hibernate都允許這樣做。 您仍可以使用query hints通過EclipseLink獲取所需的行爲。

看看下面的文章:

下面的鏈接也可以是有用的:

http://wiki.eclipse.org/EclipseLink/Examples/JPA/QueryOptimization

+0

[這篇文章](http://java-persistence-performance.blogspot.com.br/2010/08/batch-fetching-optimizing-object-graph.html)也是一個非常好的關於加入獲取和批處理的源碼提示。 – 2012-07-24 23:08:29

+0

我不明白提示如何工作。不應該暗示 「e.middle ='M'」而不僅僅是「e.middle」。否則,我該如何「提示」eclipselink只在中間='M'上過濾? – 2012-07-24 23:22:18

+1

你仍然會在查詢中使用你的過濾器:'e.middle =:middle'和'e.address.state =:state'。使用提示來加入獲取'e.address'。[本文](http://java-persistence-performance.blogspot.com.br/2012/04/objects-vs-data-and-filtering-join.html)也建議繞過緩存。 – 2012-07-25 00:19:08