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に同じ形式を使用していません。ここからどこへ行くべき?
あなたは、動作していないと言っても、レコードが取得されない、または例外が発生していることを意味します。この基準に一致するレコードがDBにありますか? – pvpkiran
すみません。指定されたタイムスタンプの後にupdateTimestampを持つサブセットではなく、すべてのエンティティを取得しています。 –
'@ Query'を削除してみてください。 Springデータは、メソッド名でクエリを作成するのに十分なインテリジェントです。問題はあなたが '>'を使って比較している方法だと思います。そのような複雑さをフレームワークに任せます。 @ Query – pvpkiran