sissue:弹簧数据中缺少命名参数JPA查询后多个插入后查询

问题描述 投票:0回答:1
问题:

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

java spring spring-data-jpa
1个回答
0
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.