У меня есть несколько сложная сущность, подобная следующей (обратите внимание на суперкласс с множеством других полей):
public class Question extends Entry {
@OneToMany(orphanRemoval = true, mappedBy = "question")
@JsonManagedReference
private List<Answer> answers = new ArrayList<>();
private Long viewCount = 0L;
private Category category;
@OneToMany(mappedBy = "question", fetch = FetchType.LAZY,
cascade = CascadeType.ALL, orphanRemoval = true)
private List<QuestionTranslation> translations = new ArrayList<>();
@Transient
private double distance;
}
distance
должно быть вычислено из БД при извлечении набора результатов из собственного запроса,Например,
SELECT q.*, ST_Distance_Sphere(cast(q.location as geometry), ST_MakePoint(cast(?1 as double precision), cast(?2 as double precision))) as distance from question q
Я не могу использовать @Formula
для аннотирования моего поля distance
, так как запрос должен принимать параметры.
Как сопоставить поле distance
из запроса SQLрезультат для моего поля сущности distance
, в то время как все другие сопоставления будут выполняться Hibernate?
Редактировать
На основе предложения @gmotux я создал сущность-обертку.
@Entity
@SqlResultSetMapping(
name="MappingQ",
entities={
@EntityResult(
entityClass = QuestionWithDistance.class,
fields={
@FieldResult(name="distance",column="distance"),
@FieldResult(name="question",column="question")})})
public class QuestionWithDistance{
@Id
@GeneratedValue
private String id;
@OneToOne
private Question question;
private double distance;
}
Запрос
Query query = entityManager.createNativeQuery("SELECT q.*, 222.22 as distance from question q", "MappingQ");
Но он всегда терпит неудачу с
org.postgresql.util.PSQLException: The column name id1_15_0_ was not found in this ResultSet.