0

如何在 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 列附近打开 [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 < e2.radacctid 其中 e2.radacctid 为 NULL 且 e1.acctstoptime 不为 NULL 且 DATEDIFF(NOW(), e1.acctstoptime) > ?1]"

4

2 回答 2

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

当然,它比原来的慢。

于 2013-02-04T14:54:38.290 回答
0

(JPQL 的)FROM 子句中的“ON”在 JPA2.1 之前是无效的语法,这还不是最终的。可能将“ON”子句放在 WHERE 中,尽管意义不同。请注意,一些 JPA 实现已经提供了对它的支持(例如DataNucleus JPA

于 2013-02-04T14:21:51.817 回答