JPQL org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданный токен: объединение рядом со строкой 1 - PullRequest
0 голосов
/ 28 июня 2018
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface SearchRepository extends 
         PagingAndSortingRepository<CPAttribute, Long>
{
    @Query("select cpa.cpAttributeId from CPAttribute cpa " +
    " union " +
    " select cps.cpGroupId from CustPro cps")
    Page<CustProProjection> findBySerial(Pageable pageable);
}

Я пытаюсь получить набор данных из двух разных таблиц, используя оператор объединения нестандартных запросов JPQL данных. Это весеннее загрузочное приложение, вызывающее код хранилища. Приведенный выше код компилируется, но при запуске сервера выдает ошибку

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: union near line 1
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: union near line 1.

Jars used:
spring-data-jpa-2.0.6.RELEASE.jar
spring-data-commons-2.0.6.RELEASE.jar
spring-orm-5.0.5.RELEASE.jar

Код выдает ошибку для оператора объединения. Кто-нибудь может подсказать, как решить эту ошибку?

1 Ответ

0 голосов
/ 29 июня 2018

Как Али Акбар Азизхани написал в комментариях: В JPQL нет ключевого слова UNION. Простым подходом было бы вместо этого использовать собственный оператор SQL.

В качестве альтернативы можно превратить два запрашиваемых объекта в иерархию типов и получить аналогичный результат, запросив супертип. Хотя, в общем, я бы посоветовал не полагаться на наследование, поскольку оно создает значительную дополнительную сложность.

...