Как зафиксировать значение динамически генерируемого столбца в базе данных с помощью JPA (спящий режим)? - PullRequest
0 голосов
/ 15 апреля 2020

Предположим, у меня есть следующая сущность JPA:

@Entity
@Table(name = "places")
public class Place {

    @Id @GeneratedValue
    private Long id;
    private String name;
    private double lat;
    private double lng;

    // Getters and setters
}

и репозиторий Spring с именем PlacesRepository, у которого есть собственный запрос:

public interface PlacesRepository extends CrudRepository<Place, Long> {

    @Query(
        value = "SELECT *, DISTANCE(lat,lng,:myLat,:myLng) AS distance " +
                "FROM places ORDER BY distance",
        nativeQuery = true
    )
    List<Place> nearestPlaces(
        @Param("myLat") double myLat,
        @Param("myLng") double myLng
    );

}

Эта функция DISTANCE предназначена только для иллюстрации собственного функция базы данных. Поскольку я использую PostGIS, это будет эквивалентно ST_Distance. Он возвращает расстояние, используя координаты каждой записи и координаты метода.

Как мне захватить это поле «расстояние», не сохраняя его в таблице ??? Я не хочу хранить это, потому что это Dynami c. Я просто хочу вернуть его с сущностью как json.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Здесь можно использовать HQL, а не собственный запрос. Например, вы можете создать простой класс результата:

class PlaceToDistancePair {
    private Place place;
    private double distance;
    public PlaceToDistancePair(Place place, double distance) {
        this.place = place;
        this.distance = distance;
    }
// getters and setters
}

, и тогда ваш @Query будет выглядеть примерно так:

@Query(
        value = "SELECT new PlaceToDistancePair(p, DISTANCE(lat,lng,:myLat,:myLng)) FROM places p")
List<PlaceToDistancePair> placeToDistanceList;

Вы можете найти больше о select new здесь , а также там вы найдете select new map конструкцию, которая, возможно, также подойдет вам для отображения места на расстоянии без PlaceToDistancePair класса.

Однако, в случае вашей функции (например, ST_Distance ) не зарегистрирован в спящем диалекте, необходимо зарегистрировать его самостоятельно. Проверьте здесь как Влад делает это в разделе «Регистрация функции SQL с помощью диалекта гибернации».

Также вы можете использовать API-интерфейс CriteriaBuilder, который гораздо более гибок , но требует больше кода. Читайте здесь , чтобы узнать больше

0 голосов
/ 15 апреля 2020

Возможно, вы попробуете это:

List list = em
          .createQuery("SELECT FUNCTION("'"+myLat+"'"+",'"+myLng+"')"
                  + " FROM schemaName")
          .getResultList();

источник образец с веб-сайта

В этой ситуации вы получаете данные из своей собственной функции. Возможно задать этой функции все вопросы запроса, которые вам нужны. Не только DISTANCE, но и все данные, которые вы хотели бы получить.

...