2017-08-01 78 views
0

我有這個資源庫:我是否必須在spring數據中避免原生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

@Kayaman因爲我們做不到。數據庫在另外兩個應用程序之間共享,重新配置它需要部分重寫兩個應用程序。 – BackSlash

回答

2

第一個選項更具可讀性和安全性,因爲您無法錯誤地傳遞錯誤日期。

第二個選項沒有解釋任何關於您想要實現的內容,並允許您自己指定參數。這與邏輯意義上的第一個查詢不同。

恕我直言,你不必避免任何事情給你一個很好的,乾淨的解決方案,除非你在官僚環境中工作,給你一套你需要服從的愚蠢規則。

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的方式。不管怎樣,謝謝。 –

相關問題