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 WHERE e2.radacctid IS NULL AND e1.acctstoptime IS NOT NULL AND DATEDIFF(NOW(), e1.acctstoptime) > ?1]"

4

2 に答える 2

0

(JPQLの)FROM句の「ON」は、JPA2.1より前では無効な構文であり、まだ最終的なものではありません。意味は同じではありませんが、「ON」句をWHEREに入れます。ただし、一部の JPA 実装ではすでにサポートが提供されていることに注意してください (例: DataNucleus JPAが提供) 。

于 2013-02-04T14:21:51.817 に答える
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 に答える