@Query(value =
"SELECT * " +
"WHERE (type REGEXP ?1) " +
"AND status= ?2 " +
"AND date(createdAt)..." +
"ORDER BY id DESC " +
"LIMIT ?4",
nativeQuery = true)
Optional<List<Item>> findLatest(String type, String status, String date, int limit);
只有当参数中的date值不为空时,我才希望通过createdAt筛选此查询。
如果是String date = null
,则查询不应考虑AND date(createdAt)...
但是,如果String date = "today"
,则查询应该包括类似AND date(createdAt) = CURRENT_DATE
的内容
我怎样才能做到这一点?
简化您可以制作
如果你有更多的选择,你需要时的情况
这个想法是,当条件不满足时,我们让和部分始终为真使得如果所有其他条件都满足,则其中calsue为真
SELECT * FROM
A
WHERE
status= 72
AND IF( date = "today" , date(createdAt), current_date) = current_date
我们通常处理此问题的方法是向允许空日期的WHERE
子句添加逻辑检查。
@Query(value = "SELECT * " +
// ...
"WHERE (type REGEXP ?1) AND " +
" status = ?2 AND " +
" (DATE(createdAt) = ?3 OR ?3 IS NULL) " +
"ORDER BY id DESC " +
nativeQuery = true)
Optional<List<Item>> findLatest(String type, String status, String date);
请注意,不可能将参数绑定到LIMIT
子句,因此我删除了它。相反,您应该使用Spring的分页API。