Исключение при использовании @ResultSetMapping в собственном запросе SQL с репозиторием Spring Data JPA? - PullRequest
0 голосов
/ 12 июля 2020

В настоящее время я создаю собственный запрос SQL с Spring Data JPA, который использует @SqlResultSetMapping. Запрос ищет, фильтрует строки на основе определенных параметров, а затем возвращает все столбцы таблицы сущностей, а также дополнительно вычисляет другой столбец на лету. Примерно так:

@Entity
@NamedNativeQuery(
        name = "Entity.searchBySearchParams",
        resultSetMapping = "SearchResultMapping",
        query = "select entity.*, (*calculation*) as anotherField from ..."
)
@SqlResultSetMapping(
        name = "SearchResultMapping",
        entities = @EntityResult(entityClass = Entity.class),
        columns = @ColumnResult(name = "anotherField", type = double.class)
)
public class Entity { ... }

И затем я пытаюсь вызвать этот собственный именованный запрос из моего репозитория (который расширяет JpaRepository<T, Long>) следующим образом:

@Query(nativeQuery = true, name = "Entity.searchBySearchParams")
List<Object[]> searchBySearchParams( ... lots of params ... );

Где я Я ожидаю, что searchBySearchParams(...)[0] будет иметь тип Entity и searchBySearchParams(...)[1] тип Double.

К сожалению, я получаю это исключение при попытке вызвать указанный выше метод репозитория:

    org.springframework.dao.InvalidDataAccessApiUsageException: Cannot create TypedQuery for query with more than one return; nested exception is java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return
    
        at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)
        at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:257)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
        at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
        at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
....

Что странно, поскольку вызов запроса и применение моего сопоставления набора результатов напрямую с помощью метода EntityManage#createNamedQuery работали отлично.

Я что-то упускаю или я должен опубликовать это в Spring Data Jira? Ни JPA, ни Spring документация не предоставили информацию для моего случая ...

Дополнительная справочная информация:

На самом деле дополнительный столбец anotherField является транзитивным свойством в моем Entity. Я не нашел способа сопоставить этот столбец с транзитивным свойством, поэтому мой метод репозитория в настоящее время возвращает Object [].

...