Проблема: < /p>
У меня есть запрос JPA Spring Data, который сначала работает нормально, но после вставки записи три раза. В сообщении исключения говорится, что некоторые названные параметры отсутствуют, даже если они передаются правильно. < /P>
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]
< /code>
Подробности: < /p>
Это происходит после вставки объекта, записывающей ровно три раза с одинаковыми значениями 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 queryEntitiesWithCustomSorting(
@Param("param1") String param1,
@Param("param2") String param2,
@Param("param3") String param3,
@Param("param4") EnumA param4,
@Param("param5") EnumB param5,
Pageable pageable);
< /code>
fix: < /p>
Я добавил фиктивные условия, чтобы убедиться, что Param3, Param4 и Param5 всегда были включены в запрос: < /p>
@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 queryFeedbackTemplatesWithCustomSorting(
@Param("param1") String param1,
@Param("param2") String param2,
@Param("param3") String param3,
@Param("param4") EnumA param4,
@Param("param5") EnumB param5,
Pageable pageable);
< /code>
Исправление добавляет фиктивные условия, чтобы убедиться, что Param3, Param4 и Param5 всегда были включены в запрос: < /p>
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)
< /code>
Проблема, по -видимому, связана с тем, как данные JPA обрабатывают данные JPA, и его поведение к кэшированию. На самом деле вы вызываете такое поведение? Есть ли лучшее решение этой проблемы без использования фиктивных условий?
Подробнее здесь: https://stackoverflow.com/questions/795 ... le-inserts