JPA,左外连接在同一个表上

时间:2013-02-04 14:20:37

标签: java 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");

我收到错误:“意外令牌:ON第1行,第122列[SELECT e1 FROM com.homersoft.wh.db.entity.radius.RadAcct e1 LEFT OUTER JOIN com.homersoft.wh.db.entity.radius .RadAcct e2 ON e1.username = e2.username AND e1.radacctid&lt; e2.radacctid WHERE e2.radacctid IS NULL AND e1.acctstoptime IS NOT NULL AND DATEDIFF(NOW(),e1.acctstoptime)&gt;?1]“

2 个答案:

答案 0 :(得分:0)

FROM子句(JPQL)中的“ON”在JPA2.1之前是无效的语法,并且还不是最终的。把“ON”子句放在WHERE中,虽然意义不一样。请注意,虽然一些JPA实现已经提供了对它的支持(例如DataNucleus JPA

答案 1 :(得分: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");

当然它比原来的慢。