it-swarm.com.ru

Возврат пользовательского объекта из Spring Data с помощью Native Query

Мой вопрос основан на другой пост . Как я могу добиться того же с помощью собственного запроса? Собственные запросы не допускают JPQL, поэтому также не допускают новые экземпляры.

МОЙ ПОЖО.

class Coordinates {

    private final BigDecimal latitude
    private final BigDecimal longitude

    ...
}

Моя таблица базы данных содержит координаты по периметру города, поэтому есть три столбца: название города, широта, долгота. Каждый город содержит множество (на самом деле, много) координат периметра, которые будут использоваться для построения теневой области в Картах Google.

Я намереваюсь построить простой нативный запрос к этой таблице, который должен вернуть список координат. 

7
Sidney de Moraes

Нашел ответ на другой пост . В основном я использовал SqlResultSetMapping вместе с ConstructorResult (другого способа не получилось) с особым вниманием к комментарию к принятому ответу упомянутого поста: вам необходимо добавить аннотацию @NamedNativeQuery к сущности используемых interfaceИ добавьте . к имени объекта, иначе оно не будет работать.

Пример:

@Entity
@Table(name = "grupo_setorial")
@SqlResultSetMapping(
        name = "mapeamentoDeQuadrantes",
        classes = {
                @ConstructorResult(
                        targetClass = Coordenada.class,
                        columns = {
                                @ColumnResult(name = "latitude"),
                                @ColumnResult(name = "longitude")
                        }
                )
        }
)
@NamedNativeQuery(
        name = "GrupoCensitario.obterPerimetroDosSetores",
        query = "SELECT latitude as latitude, longitude as longitude FROM coordenadas where id_setor IN (:setores)",
        resultSetMapping = "mapeamentoDeQuadrantes"
)
public class GrupoCensitario {
11
Sidney de Moraes

Это https://jira.spring.io/browse/DATAJPA-980 и Здесь это проект, который демонстрирует проблему.

@Query(value = "SELECT name AS name, age AS age FROM Person", nativeQuery = true)
List<PersonSummary> findAllProjectedNativeQuery();

Это исправлено в выпуске Spring Data JPA 2.0 GA (Kay), который поставляется с Hibernate 5.2.11. 

Эта проблема также исправлена ​​для Spring Data 1.10.12 (Ingalls) и 1.11.8 (Hopper), но для работы потребуется Hibernate 5.2.11.

2
ltsallas

Вам нужно будет использовать sql набор результатов сопоставления который является частью JPA.

2
johncena

Если вы используете последнюю версию spring-data, а также используете Repositories, я лично считаю, что ответ из Itsallas приводит к правильному решению.

На самом деле я еще не знал о (Spring Data) Projections, и мне потребовалось время, чтобы понять, что он показывает в своем примере.

Поэтому я просто хочу добавить ссылку на Spring Data JPA - Reference Documentation, заглянуть в главу Проекции .

Методы запроса Spring Data обычно возвращают один или несколько экземпляров совокупного корня, управляемого репозиторием. Однако иногда может быть желательно создать проекции на основе определенных атрибутов этих типов. Spring Data позволяет моделировать выделенные типы возврата, чтобы более избирательно получать частичные представления управляемых агрегатов.

0
morecore