2013-02-04 102 views
0

我如何可以執行左外連接在JPA與同桌?當我試試這個:JPA,左外連接在同一個表

sql.append("SELECT e1 FROM "); 
sql.append(getPersistentClass().getName()); 
sql.append(" e1 LEFT OUTER JOIN "); 
sql.append(getPersistentClass().getName()); 
sql.append(" e2 ON e1.username = e2.username AND e1.radacctid < e2.radacctid "); 
sql.append("WHERE e2.radacctid IS NULL "); 
sql.append("AND e1.acctstoptime IS NOT NULL "); 
sql.append("AND DATEDIFF(NOW(), e1.acctstoptime) > ?1"); 

我得到錯誤:「意外的標記:近線1,列122 [選擇E1 FROM com.homersoft.wh.db.entity.radius.RadAcct E1 LEFT OUTER JOIN融爲一體。 homersoft.wh.db.entity.radius.RadAcct e2 ON e1.username = e2.username AND e1.radacctid < e2.radacctid WHERE e2.radacctid IS NULL AND e1.acctstoptime IS NOT NULL AND DATEDIFF(NOW(),e1。 acctstoptime)>θ1]」

回答

0

「ON」(的JPQL)FROM子句中是JPA2.1之前無效的語法,這是還沒有最後。將「ON」子句放在WHERE中,儘管意義不同。需要注意的是一些JPA實現將已經提供了對它的支持,雖然(例如DataNucleus JPA一樣)

+0

甚至冬眠4.2核心有ON子句的支持。 –

0

我已經改變了查詢這樣的:

StringBuilder sql = new StringBuilder(); 
    sql.append("SELECT e1 FROM "); 
    sql.append(getPersistentClass().getName()); 
    sql.append(" e1 "); 
    sql.append("WHERE e1.id = ("); 

    sql.append(" SELECT MAX(e2.id) FROM "); 
    sql.append(getPersistentClass().getName()); 
    sql.append(" e2 WHERE e1.userName = e2.userName)"); 

    sql.append("AND e1.stopTime IS NOT NULL "); 
    sql.append("AND e1.stopTime < ?1"); 

當然是比原來更慢。