我是否必须在spring数据中避免原生sql?
问题描述:
我有这个资源库:我是否必须在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);
有什么好处和缺点?
答
第一个选项更具可读性和安全性,因为您无法错误地传递错误日期。
第二个选项没有解释任何关于您想要实现的内容,并允许您自己指定参数。这与逻辑意义上的第一个查询不同。
恕我直言,你不必避免任何事情给你一个很好的,干净的解决方案,除非你在官僚环境中工作,给你一套你需要服从的愚蠢规则。
答
如果您不想在每次调用存储库方法时都通过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的方式。不管怎样,谢谢。 –
不能回答这是本机查询和传递日期之间的更好,但我会传递'Date'对象。一旦我在一个项目中工作,该项目的数据库所在的服务器的时区不同于托管java应用程序的服务器。所以我们不能使用'current_timestamp',否则它会成为一个问题。所以我总是建议让应用程序处理日期以避免这些问题。 – BackSlash
@BackSlash你为什么不把数据库配置成正确的时区? – Kayaman
@Kayaman因为我们做不到。数据库在另外两个应用程序之间共享,重新配置它需要部分重写两个应用程序。 – BackSlash