i有一个弹簧数据JPA查询,最初效果很好,但在插入记录三次后失败。异常消息说,即使正确传递了一些命名的参数,也缺少它们。
java.lang.IllegalArgumentException: No parameter named ':param3' in query with named parameters [param2, param1]
java.lang.IllegalArgumentException: No parameter named ':param4' in query with named parameters [param2, param1]
java.lang.IllegalArgumentException: No parameter named ':param5' in query with named parameters [param2, param1]
尾tail:
在用相同的param2和param3值插入实体记录三次之后,发生这种情况。在此之前,无论发射多少次,查询都可以正常工作。插入三个实体记录后,此查询随后的所有使用都会产生错误。
工作正常,直到我插入三个(或更多)实体记录:
@Query("SELECT ft FROM Entity ft WHERE ft.someField1.param1 = :param1 AND ft.param2 = :param2 " +
"ORDER BY " +
"(CASE WHEN ft.param3 = :param3 THEN 0 ELSE 1 END), " +
"(CASE WHEN ft.param3 = :param3 AND ft.param4 = :param4 AND ft.param5 = :param5 THEN 0 " +
" WHEN ft.param3 = :param3 AND (ft.param4 = :param4 OR ft.param5 = :param5) THEN 1 " +
" WHEN ft.param3 = :param3 THEN 2 " +
" WHEN ft.param4 = :param4 AND ft.param5 = :param5 THEN 3 " +
" WHEN (ft.param4 = :param4 OR ft.param5 = :param5) THEN 4 ELSE 5 END), " +
"ft.updatedTimestamp DESC")
Page<Entity> queryEntitiesWithCustomSorting(
@Param("param1") String param1,
@Param("param2") String param2,
@Param("param3") String param3,
@Param("param4") EnumA param4,
@Param("param5") EnumB param5,
Pageable pageable);
fix:
I添加了虚拟条件,以确保param3,param4和param5始终包含在查询中:
@Query("SELECT ft FROM Entity ft WHERE ft.someField1.param1 = :param1 AND ft.param2 = :param2 " +
"AND (:param3 IS NULL OR ft.param3 IS NOT NULL) " +
"AND (:param4 IS NULL OR ft.param4 IS NOT NULL) " +
"AND (:param5 IS NULL OR ft.param5 IS NOT NULL) " +
"ORDER BY " +
"(CASE WHEN ft.param3 = :param3 THEN 0 ELSE 1 END), " +
"(CASE WHEN ft.param3 = :param3 AND ft.param4 = :param4 AND ft.param5 = :param5 THEN 0 " +
" WHEN ft.param3 = :param3 AND (ft.param4 = :param4 OR ft.param5 = :param5) THEN 1 " +
" WHEN ft.param3 = :param3 THEN 2 " +
" WHEN ft.param4 = :param4 AND ft.param5 = :param5 THEN 3 " +
" WHEN (ft.param4 = :param4 OR ft.param5 = :param5) THEN 4 ELSE 5 END), " +
"ft.updatedTimestamp DESC")
Page<Entity> queryFeedbackTemplatesWithCustomSorting(
@Param("param1") String param1,
@Param("param2") String param2,
@Param("param3") String param3,
@Param("param4") EnumA param4,
@Param("param5") EnumB param5,
Pageable pageable);
修复添加了虚拟条件,以确保param3,param4和param5始终包含在查询中:
AND (:param3 IS NULL OR ft.param3 IS NOT NULL)
AND (:param4 IS NULL OR ft.param4 IS NOT NULL)
AND (:param5 IS NULL OR ft.param5 IS NOT NULL)
问题似乎与弹簧数据JPA处理查询参数及其缓存行为有关。
Param3,param4和param5总是正确传递,弹簧在插入三个记录后停止识别它们。问题:
有人遇到一个类似的问题,您能解释一下实际上可能导致这种行为的原因吗?在不使用虚拟条件的情况下,是否可以更好地解决此问题?
也许你可以做
SELECT
ft,
case when ft.param3 = :param3 then 4 else 0 end as sort3
case when ft.param4 = :param4 then 2 else 0 end as sort4
case when ft.param5 = :param5 then 1 else 0 end as sort5
FROM Entity ft
WHERE
ft.someField1.param1 = :param1
AND ft.param2 = :param2
ORDER BY sort3 + sort4 + sort5 DESC