Найти ближайших водителей, используя Spring Data JPA Criteria Query - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть данные о драйвере, как показано ниже.

[
  {
    "name": "Martin",
    "age": 37,
    "status": "online",
    "deleted": false,
    "place": {
      "name": "Mali",
      "lat": 18.341002,
      "lon": -1.700659
    }
  },
  {
    "name": "John",
    "age": 27,
    "status": "offline",
    "deleted": false,
    "place": {
      "name": "Oregon",
      "lat": 18.393135,
      "lon": -1.810474
    }
  }
  :
  :
  :
]

Я сохранил детали в своей БД с использованием JPA 2.0. Во многих блогах я видел людей, использующих @Embedded и для которых координаты места определены как @Embedded и @Embeddable для хранения координат GPS (я не знаю, какие преимущества это даст), поэтому я подумал о том, чтобы сделать то же самое в моем драйвере, как показано ниже

Driver.java

@Entity
@Table(
    name = "driver",
    uniqueConstraints = @UniqueConstraint(name = "uc_drivers_id", columnNames = {"id"})
)
public class Driver implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Id
    @Column(name="name", nullable = false)
    private String name;

    @Embedded
    private City city;

    @Column(name="age")
    private Integer age;

    @Column(name="status")
    private String status;

    @Column(name="deleted")
    private Boolean deleted;

    :
    :
    :
}

Place.java

@Embeddable
public class Place {

    @Column(name = "location")
    private final Point location;

    @Column(name = "name")
    private String name;

    @JsonProperty
    public double getLatitude()
    {
        return this.location.getY();
    }

    @JsonProperty
    public double getLongitude()
    {
        return this.location.getX();
    }
    :
    :
    :
}

Сценарий

Я хочу найти все драйверы, соответствующие приведенному ниже условию

  1. Водители, чей возраст превышает 20
  2. Драйверы, которые онлайн
  3. Водители, которые находятся в 30 км от моих координат местоположения (скажем, 18.226253, -1.980688)

Я выполнил первые два условия, как показано ниже, используя критерии, но не знаю, как мне достичь третьего

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Driver> criteriaQuery = criteriaBuilder.createQuery(Driver.class);
Root<Driver> entity= criteriaQuery.from(Driver.class);
Predicate agePredicate = criteriaBuilder.greaterThan(entity.get("age"), 20);
Predicate jobPredicate = criteriaBuilder.equal(entity.get("status"), "online");
Predicate wherePredicate = criteriaBuilder.and(agePredicate, jobPredicate);
TypedQuery<Driver>  query = entityManager.createQuery(criteriaQuery.select(entity).where(wherePredicate));
return query.getResultList();

Вопрос

  1. В чем преимущество использования @Embedded и @Embeddable для хранения координат GPS
  2. Как найти ближайшие водители по координатам

Я использую Spring Boot 2, Spring Data JPA 2 и MySQL

1 Ответ

0 голосов
/ 17 ноября 2018

Это особенность, с которой не все базы данных могут работать хорошо (по умолчанию). Если у вас есть MySQL сервер, он может хранить пространственные координаты из коробки, но, например, PostgreSQL требуется расширение.

Вы отметили spring-data-jpa, поэтому я предполагаю, что вы используете Hibernate в качестве вашего JPA-провайдера. Hibernate также нуждается в расширении, чтобы хорошо работать с пространственными координатами.

Посмотрите на эту статью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...