2016-12-20 11 views
2

私はSpringアプリケーションを作成していますが、データベースクエリを簡略化するためにJpaRepositoryを使用しています。DISTINCT ONのJpaRepositoryメソッド名

DISTINCT ONでJpaRepository規則を使用してメソッド名を作成する際に問題があります。ここに私のSQLクエリです:

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を使用することも可能である私は、このような名前を試してみましたが、それは働いていない

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 

メソッド名に?私はクラスが上記よりはるかに複雑で、私はすべてのフィールドをクエリに追加したいので、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行をしたい場合は、あなたのような何かを行うことができます:

:これはすでにあなたのような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(); 

をこの上

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

関連する問題