2017-05-18 11 views
0

spring-boot-startter-data-jpa-1.5.2.RELEASEを使用して、SpringブートRESTサーバーを開発中です。私は次のPOJOクラス階層を持っています。まず、基本クラスのエンティティ:spring-boot/spring-data-jpaフィルタリングなしの結果を返すDateフィールドによるカスタムクエリフィルタリング

@javax.persistence.Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class Entity implements Serializable {  

    @Id 
    @Column(name = "id", nullable = false, length = 48) 
    public String id = UNINITIALIZED_ID; 

    /** 
    * The timestamp for when this entity was last updated. 
    */ 
    @Column(columnDefinition = "timestamp with time zone") 
    @Temporal(TemporalType.TIMESTAMP) 
    public Date updateTimestamp = new Date(); 

} 

次具象サブクラスの患者:

@javax.persistence.Entity 
@Table(indexes={@Index(columnList="updateTimestamp")}) 
public class Patient extends Entity { 
... 
} 

そのupdateTimestamp指定されたタイムスタンプの後にある患者をフェッチするためにカスタムメソッドを次のように私は私のPatientRepositoryインターフェイスを定義します。私は高度な休憩クライアントクロームプラグインを経由して、次のGETリクエストを発行したときupdateTimestamnpことにより、フィルタが動作していないいくつかの未知の理由

@RepositoryRestResource(collectionResourceRel = "patients", path = "patients") 
public interface PatientRepository extends JpaRepository<Patient, String> { 
    List<Patient> findByUpdateTimestampAfter(@DateTimeFormat(iso=DateTimeFormat.ISO.DATE_TIME)@Param("after")Date after); 
} 

// url example. DateFormat matches @DateTimeFormat on param in query method. 
GET http://127.0.0.1:8090/patients?after=2030-01-10T00:00:00.000-05:00 

私は指定されたタイムスタンプ後updateTimestampを持つエンティティのみが返されることを期待するが、私が取得することは代わりにリソースコレクション内のすべてのエンティティです。

私はspring-bootでDEBUGログを有効にしました。ここで私はわからない何かが問題です。

2017-05-18 10:15:56.127 DEBUG 5292 --- [   main] o.s.d.j.r.query.JpaQueryFactory   : Looking up query for method findByUpdateTimestampAfter 
2017-05-18 10:15:56.132 DEBUG 5292 --- [   main] o.s.d.jpa.repository.query.NamedQuery : Looking up named query Patient.findByUpdateTimestampAfter 
2017-05-18 10:15:56.133 DEBUG 5292 --- [   main] o.s.d.jpa.repository.query.NamedQuery : Did not find named query Patient.findByUpdateTimestampAfter 

私は、次のスポック統合テストをwroiteし、期待通りPatientRepository.findByUpdateTimestampAfter方法に私を解析するために日付をaftergettingが動作することを示した@pvpkiranから良い提案に基づいて、 :

@SpringBootTest(classes = com.altran.medmap.server.Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
    @Transactional 

class PatientRepositorySpec extends Specification { 


    @Autowired 
    PatientRepository patientRepository; 


    @Bean 
    @Unroll  
    def 'Should GET #size patients whose updateTimestamp is after: #after'({ 
     given: 
      DateFormat dateFormat = new SimpleDateFormat('MMM d, yyyy h:mm:ss a'); 
      Date afterx = dateFormat.parse(after); 
     when: 
      List<Patient> result = patientRepository.findByUpdateTimestampAfter(after); 
     then: 
      result.size() == size; 
     where: 'result size matches expected' 
      after      | size 
      'Jan 1, 2016 00:00:00 AM' | 2 
      'Jan 1, 2030 00:00:00 AM' | 0 

    }    
} 

REST APIが依然としてすべてのエンティティを返すという事実は、依然として未解決の謎です。リポジトリインターフェイスのクエリメソッドparamで@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)を指定し、残りのURLに同じ形式を使用していません。ここからどこへ行くべき?

+0

あなたは、動作していないと言っても、レコードが取得されない、または例外が発生していることを意味します。この基準に一致するレコードがDBにありますか? – pvpkiran

+0

すみません。指定されたタイムスタンプの後にupdateTimestampを持つサブセットではなく、すべてのエンティティを取得しています。 –

+0

'@ Query'を削除してみてください。 Springデータは、メソッド名でクエリを作成するのに十分なインテリジェントです。問題はあなたが '>'を使って比較している方法だと思います。そのような複雑さをフレームワークに任せます。 @ Query – pvpkiran

答えて

0

私は最終的に、残りのインターフェイスがフィルタリングされた結果を出さない原因となっている間違った考えを見つけました。 URLパスが正しくありません。

//Incorrect URL 
http://127.0.0.1:8090/patients?after=2030-01-10T00:00:00.000-05:00 

//Correct URL based on spring-data-rest default conventions 
http://127.0.0.1:8090/patients/search/findByUpdateTimestampAfter?after=2030-01-10T00:00:00.000-05:00 

URLを修正した後、日付解析エラーが発生することに注意してください。私はその新しい質問を作成しましたhere

@pvpkiranと@Afridiの親切なヘルプに感謝します。

+0

ああ!!!それは良い :) – pvpkiran

関連する問題