Как использовать предложение IN в аннотации JPA @Query

Я определил этот метод

 @Query("select cs from CenterStudy cs where cs.id in (?1)")
 @EntityGraph(value = "centerStudyAndNotifiedUsers", type = EntityGraph.EntityGraphType.LOAD)
 List<CenterStudy> findAllByIdsWithCenterAndUsers(List<Long> ids);

Список с идентификаторами не является ни пустым, ни пустым, но я всегда получаю следующее исключение:

java.lang.NullPointerException
    at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:613)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1900)

Я почти уверен, что это как-то связано с определением предложения IN.

Любые предложения приветствуются!

3 ответа

Решение

Это общая проблема, ошибка в Hibernate который вы можете найти по адресу:

NullPointer при объединении запроса JPQL с предложением in и @NamedEntityGraph, где говорится, что:

Когда вы комбинируете запрос JPQL с предложением in и @NamedEntityGraph, вы получаете NullPointerException в org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67) при выполнении запроса.

Так что вам придется удалить @EntityGraph аннотация здесь, чтобы решить эту проблему.

public List<DealInfo> getDealInfos(List<String> dealIds) {
        String queryStr = "SELECT NEW com.admin.entity.DealInfo(deal.url, deal.url, deal.url, deal.url, deal.price, deal.value) " + "FROM Deal AS deal where deal.id in :inclList";
        TypedQuery<DealInfo> query = em.createQuery(queryStr, DealInfo.class);
        query.setParameter("inclList", dealIds);
        return query.getResultList();
    }

Работает с JPA 2

Я сталкивался с этой проблемой раньше. Я исправил это, используя именованные параметры вместо позиционных параметров. Пример:

"Select p from product where p.id in(?)" -- not working

заменен на:

"Select p from product where p.id in(:idList)" -- OK
Другие вопросы по тегам