2017-07-05 39 views
0

這是MySQL查詢,我已經:JPA:ORDER BY之前GROUP BY在JPARepository

SELECT * FROM (SELECT vev.* FROM vital_entry ve 
INNER JOIN vital_entry_values vev ON ve.vital_entry_id=vev.vital_entry_id 
WHERE ve.account_id=146 
ORDER BY date_entered DESC) t1 
GROUP BY vital_id ; 

如何在JPA做到這一點?我想:

@Query("SELECT t1 FROM (SELECT ve FROM VitalEntry ve " + 
      "INNER JOIN ve.vitalEntryValues vev " + 
      "WHERE ve.accountId=:accountId " + 
      "ORDER BY ve.dateEntered DESC) t1") 
List<VitalEntry> getRecentVitalValues(@Param("accountId") int accountId); 

但IntelIj顯示錯誤expected identifer, got '('

回答

1

使用本地查詢來代替:

@Query("SELECT * FROM (SELECT ve.* FROM vital_entry ve INNER JOIN vital_entry_values vev ON ve.vital_entry_id=vev.vital_entry_id WHERE ve.account_id=:accountId ORDER BY date_entered DESC) t1 GROUP BY vital_id", nativeQuery=true) 
List<VitalEntry> getRecentVitalValues(@Param("accountId") int accountId); 
+0

什麼組的? – HeisenBerg

+0

假設vitalId是字段名稱,「ve.vitalId通過ve.dateEntered desc命令組」。 –

+0

但這並沒有給我預期的結果。我想按日期順序排序,然後按vitalId分組,所以我會得到每個vitalId的最新值 – HeisenBerg

1

這給了我預期的結果

@Query("SELECT new com.v2.model.VitalValue(vev.vitalId, vev.value, max(ve.dateEntered), ve.vitalEntryType, vev.type) FROM VitalEntry ve " + 
      "INNER JOIN ve.vitalEntryValues vev " + 
      "WHERE ve.accountId=:accountId " + 
      "GROUP BY vev.vitalId " + 
      "ORDER BY max(ve.dateEntered) DESC") 
List<VitalValue> getRecentVitalValues(@Param("accountId") int accountId); 
+0

是的,您可以使用extral實體自定義結果集。 –