JPQL中使用日期字面量报IllegalArgumentException错误是什么原因?
报错原因
- 你使用的
{d '2019-12-31'}属于JDBC专属的日期转义语法,不被JPQL标准语法支持,Hibernate在解析JPQL语句时无法识别未定义的{字符,因此直接抛出字符不合法的异常。
正确的实现方案
- 方案1:使用JPQL内置的日期函数处理字面量,改写后的语句如下:
SELECT r FROM Restaurant r LEFT JOIN r.dishes dh ON dh.date = DATE('2019-12-31') GROUP BY r
- 方案2(更推荐):使用参数绑定传入日期,避免硬编码字面量,同时规避SQL注入风险:
- 改写JPQL语句为:
SELECT r FROM Restaurant r LEFT JOIN r.dishes dh ON dh.date = :targetDate GROUP BY r- 在业务代码中给参数赋值,示例如下(以Spring Data JPA为例):
调用时直接传入@Query(value = "上面的JPQL语句", nativeQuery = false) List<Restaurant> findByDishesDate(@Param("targetDate") LocalDate targetDate);LocalDate.of(2019,12,31)即可。
内容的提问来源于stack exchange,提问作者Иван Устинов
相关产品推荐
相关产品推荐

