2016-12-20 52 views
2

我創建Spring應用程序,並使用JpaRepository來簡化數據庫查詢。JpaRepository方法名稱DISTINCT ON

我有使用DISTINCT ON使用JpaRepository約定創建方法名稱的問題。這是我的SQL查詢:

SELECT DISTINCT ON (s.device_id) 
    s.status_id, 
    s.error, 
    s.receive_time, 
    s.device_id 
FROM statuses s 
ORDER BY s.device_id, s.receive_time DESC 

我想這樣的名字,但它不工作:

List<Status> findDistinctByDeviceId_OrderByReceiveTimeDesc(); 

這裏是我的課(簡體):

public class Status { 
    private long status_id; 
    private String error; 
    private Date receive_time; 
    private Device device_id; 
} 

public class Device { 
    private long device_id; 
    private String name; 
} 

是,甚至有可能使用DISTINCT ON在方法名中?我不想使用SQL查詢,因爲我的類比上面更復雜,我想添加每個字段進行查詢。

+0

對於初學者來說,你沒有一個名爲'device'的字段......你有一個名爲'device_id'的字段。 –

+0

@ M.Deinum它只是在這裏發佈的錯誤,在代碼中是可以的。 – user3626048

回答

0

我用這樣的事情,它的工作原理:

@Query(value = "select distinct on (s.device_id) s.* " + 
     "from statuses s " + 
     "order by s.device_id, s.receive_time desc", 
     nativeQuery = true) 
public List<Status> getStatuses(); 
0

據我所知,DISTINCT ON是數據庫特定的,而不是全局SQL命令。而且它看起來像一列不同。

但是,如果你想DISTINCT整個SQL行了,你可以這樣做:

// Spring Data allows you to specify the entity you want to distinct after the word "Distinct" 
List<Status> findDistinctStatusByOrderByReceiveTimeDesc(); 

// Or before the word "Distinct" 
List<Status> findStatusDistinctByOrderByReceiveTimeDesc(); 

這已經確保你不會收到任何重複的線條,營造像SQL輸出:

在這個
SELECT DISTINCT 
    s.device_id, 
    s.status_id, 
    s.error, 
    s.receive_time, 
    s.device_id 
FROM statuses s 
ORDER BY s.device_id, s.receive_time DESC 

的更多信息,你可以查詢到Spring Data Documentation