簡體   English   中英

JPA,同一表上的左外部聯接

[英]JPA, left outer join on the same table

如何在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列附近[從com.homersoft.wh.db.entity.radius.RadAcct e1中選擇e1左外部聯接com.homersoft.wh.db.entity.radius.RadAcct e2在e1.username = e2.username和e1.radacctid <e2.radacctid上,e2.radacctid為NULL並且e1.acctstoptime不是NULL並且DATEDIFF(NOW(),e1.acctstoptime)>?1]“

(JPQL的)FROM子句中的“ ON”在JPA2.1之前是無效的語法,並且尚未最終確定。 可能將“ ON”子句放在WHERE中,盡管含義並不完全相同。 請注意,盡管有些JPA實現已經提供了支持(例如, DataNucleus JPA確實提供了支持)

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

    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");

當然,它比原始的慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM