В настоящее время я создаю собственный запрос 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 [].