2017-11-27 5 views
0

Ich habe eine Tabelle mit der folgenden Struktur:JPA letzte Zeile pro Gruppe

Audit Tabelle

| ID  | User | Log In Date | Other Info e.g. IP | 
|-----------|-----------|---------------|--------------------------| 
|  0  |  1  | 2017/11/10 |   ...   | 
|  1  |  1  | 2017/12/10 |   ...   | 
|  2  |  2  | 2017/10/10 |   ...   | 
|  3  |  3  | 2017/09/08 |   ...   | 

In meinem AuditRepository Ich mag würde ein Verfahren zu schaffen, das die Audit mit den jüngsten Auszug/spätestes Anmeldedatum für jeden Benutzer

Audit

@Entity 
@Table(name = "Audit") 
public class Audit { 

    @Id 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private Long id; 

    private Instant loginDate 

    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    @JoinColumn(name = "User") 
    private User user; 

    // Other fields 
} 

Wie kann ich schreiben ein Repository @Query, die dies erreichen können?

Bisher habe ich versucht

@Query(value = 
      "SELECT a FROM Audit a " + 
      "LEFT JOIN Audit a1 ON a.loginDate > a1.loginDate AND a.user = a1.user " + 
      "WHERE a1.user IS NULL" 
    ) 

Aber ich habe eine Ausnahme QuerySyntaxException: Path expected for join!

+0

Welchen Provider verwenden Sie? – newOne

+0

@newOne Springboots Spring Daten, die ich vermute, verwendet JPA/Hibernate unter der Haube – Edd

Antwort

2

Ich bin keine Daten zu testen, aber ich denke, in sql dieser Arbeit sollte sein:

SELECT a 
FROM Audit a 
WHERE loginDate=(
SELECT MAX(loginDate) 
FROM Audit 
WHERE user = a.user); 
2

Sie könnten eine korrelierte Unterabfrage versuchen:

SELECT a FROM Audit a 
    inner join a.user u 
where a.loginDate = (
     select max(a1.loginDate) 
     from audit a1 inner join a1.user u1 
     where u1.id = u.id and a1.id = a.id 
) 
Verwandte Themen