Недопустимый тип столбца с запросом NATIVE jpql

это мой репозиторий:

@Repository
public interface EventRepository extends JpaRepository<Events, Long>, JpaSpecificationExecutor<Events>{

    @Query(value=" SELECT DISTINCT event.EVENT_ID "
                + "FROM EVENTS event "
                + "JOIN EVENTS event2 "
                + "ON event.EVENT_ID = event2.PARENT_ID "
                + "WHERE event.ENTITY_ID IN (?1)", nativeQuery = true)
    List<Long> getDescendantEventIdInEntityId(Set<Long> descendantEntities);
}

Почему, когда этот метод вызывается, он возвращается: Внутреннее исключение: java.sql.SQLException: тип столбца недействителен Код ошибки: 17004 Вызов: SELECT DISTINCT event.EVENT_ID FROM EVENTS event JOIN EVENTS event2 ON event.EVENT_ID = event2.PARENT_ID WHERE event.ENTITY_ID IN (?) bind => [[1]]

что не так с запросом? Если запрос в порядке, является ли это «bind => [[1]]» истинной проблемой? Если да, то почему слишком много квадратных скобок?

Я также пробовал это решение:

@Query(value=" SELECT DISTINCT event2.EVENT_ID "
                + "FROM EVENTS event "
                + "JOIN EVENTS event2 "
                + "ON event.EVENT_ID = event2.PARENT_ID "
                + "WHERE event.ENTITY_ID IN :entitiesId", nativeQuery = true)
    List<Long> getDescendantEventIdInEntityId(@Param("entitiesId") Set<Long> entitiesId);

но он возвращает мне другую ошибку: отсутствует параметр IN или OUT в индексе:: 1 Код ошибки: 17041 Вызов: SELECT DISTINCT event2.EVENT_ID FROM EVENTS event JOIN EVENTS event2 ON event.EVENT_ID = event2.PARENT_ID WHERE event.ENTITY_ID IN:entitiesId

РЕШЕНИЕ. Решено создание нового собственного запроса из EntityManager:

em.createNativeQuery(" SELECT DISTINCT event2.EVENT_ID "
                                        + "FROM EVENTS event "
                                        + "JOIN EVENTS event2 "
                                        + "ON event.EVENT_ID = event2.PARENT_ID "
                                        + "WHERE event.ENTITY_ID IN ("+idList+") AND event.STATUS = 2")
                                          .getResultList();

Где idList — это строка, созданная StringUtils.join(CollectionOfId, ",");


person Innet    schedule 06.04.2017    source источник


Ответы (1)


Если Hibernate использовался в качестве поставщика JPA, вместо привязки позиционного параметра (?1) вы также могли бы использовать привязку именованного параметра (:parameterName). Это было бы менее подвержено ошибкам, и вы могли бы опустить скобки и позволить Spring управлять синтаксисом для вашего. Вам также не нужно будет ничего разбирать самостоятельно.

Используйте привязку именованного параметра, например:

@Query(value="SELECT DISTINCT event2.EVENT_ID "
        + "FROM EVENTS event "
        + "JOIN EVENTS event2 "
        + "ON event.EVENT_ID = event2.PARENT_ID "
        + "WHERE event.ENTITY_ID IN :entityIds", nativeQuery = true)
List<Long> getDescendantEventIdInEntityId(@Param("entityIds") Set<Long> ids);

Помните о передаче null или пустого набора методу в обоих случаях! Это может привести к непредсказуемым результатам.

К сожалению, именованные параметры не являются стандартом JPA, и, возможно, EclipseLink не поддерживает его (таким образом). Затем вам нужно перейти к позиционным параметрам.

person Kevin Peters    schedule 07.04.2017
comment
Я уже пробовал это решение, но оно возвращает мне ошибку другого типа. Проверьте мой обновленный вопрос - person Innet; 10.04.2017
comment
Можете ли вы сообщить нам полный квалификатор для вашей аннотации Param? Это org.springframework.data.repository.query.Param? Кажется, что переданное значение отсутствует в вашем случае. - person Kevin Peters; 10.04.2017
comment
Это строка импорта для аннотации параметра: import org.springframework.data.repository.query.Param; я почти уверен, что значение не равно нулю - person Innet; 10.04.2017
comment
Можете ли вы сказать мне, какой поставщик JPA используется? Именованные параметры не являются стандартом JPA в нативных запросах, я знаю только, что Hibernate его поддерживает. - person Kevin Peters; 10.04.2017
comment
Только что заметил, что это ошибка eclipselink. Вот обходной путь для этого случая: bugs.eclipse.org/bugs/show_bug. cgi?id=328378 - person Innet; 11.04.2017
comment
Печально. Возможно, вы найдете обходной путь или будет исправление. Или, может быть, эксперт EclipseLink мог бы помочь здесь. - person Kevin Peters; 11.04.2017