У меня есть данные о драйвере, как показано ниже.
[
{
"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();
}
:
:
:
}
Сценарий
Я хочу найти все драйверы, соответствующие приведенному ниже условию
- Водители, чей возраст превышает 20
- Драйверы, которые онлайн
- Водители, которые находятся в 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();
Вопрос
- В чем преимущество использования
@Embedded
и @Embeddable
для хранения координат GPS
- Как найти ближайшие водители по координатам
Я использую Spring Boot 2, Spring Data JPA 2 и MySQL