2017-08-01 13 views
0

私はこのリポジトリを持っている:スプリングデータでネイティブSQLを使用しないでください。

public interface MessageRepository extends JpaRepository<Message, Long> { 
    Message findById(long id); 

    @Query(value = "SELECT * from message where sent = false and expire <= current_timestamp ", nativeQuery = true) 
    List<Message> findAllReadyMessages(); 
} 

ネイティブSQLを使用しないように良いアイデアと新しい日付を毎回押しますか?例:

List<Message> findAllBySentForProcessingFalseAndExpireIsLessThanEqual(Date expire); 

恩恵と欠点は何ですか?

+0

を試してみては、ネイティブクエリと日付を渡すの間に優れている上で答えることはできませんが、私は 'Date'オブジェクトを渡します。かつては、データベースがJavaアプリケーションがホストされていたサーバーとは異なるタイムゾーンのサーバー上にあったプロジェクトで作業しました。だから、 'current_timestamp'を使うことができませんでした。さもなければ問題になりました。だから私はいつもアプリがそのような問題を避けるために日付を処理させることをお勧めします。 – BackSlash

+0

@BackSlashなぜ、正しいタイムゾーンで動作するようにデータベースを構成していないのですか? – Kayaman

+0

@カヤマン私たちはできなかったから。データベースは2つの他のアプリケーション間で共有され、再構成すると2つのアプリケーションを部分的に書き換える必要がありました。 – BackSlash

答えて

2

最初のオプションは、誤って間違った日付を渡すことができないという点で、読みやすく安全です。

2番目のオプションは、達成しようとしていることについて何も説明せず、パラメータを自分で指定することができます。論理的な意味での最初のクエリと同じクエリではありません。

IMHOあなたが従わなければならない愚かな規則を与える官僚的な環境で働かない限り、良い、清潔な解決策を提供するものを避ける必要はありません。

0

リポジトリメソッドを呼び出すたびにDateオブジェクトを渡したくない場合は、あらかじめ定義されたJPAメソッドCURRENT_TIMESTAMPを使用します。

この

public interface MessageRepository extends JpaRepository<Message, Long> { 

    @Query(value = "SELECT m from Message m where m.sent = false and m.expire <= CURRENT_TIMESTAMP ") 
    List<Message> findAllReadyMessages(); 

} 
+0

質問は異なっていた... – faoxis

+0

ええ。 JPAのやり方だけをしたいのであれば追加したいと思っています。とりあえずありがとう。 –

関連する問題