Spring сущность, динамически вычисляемое поле с параметром из собственного запроса - PullRequest
0 голосов
/ 12 октября 2018

У меня есть несколько сложная сущность, подобная следующей (обратите внимание на суперкласс с множеством других полей):

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.

1 Ответ

0 голосов
/ 12 октября 2018

Так как вам нужны дополнительные параметры для вычисления вашего поля, вы действительно не можете использовать @Formula или даже геттер для вычисления поля.К сожалению, для вашего случая единственное, что приходит на ум, если вы используете конфигурацию на основе EntityManager для Hibernate, - это использование прослушивателя событий @PostLoad, который можно использовать для вычисления значений полей при загрузке сущности, например:

public class Question extends Entry {
    @PostLoad
    private void postLoad() {
        this.distance = DistanceCalculator.calculateDistance(Double param1,Double param2);       
        //other calculations
    }
}

Это, конечно, всего лишь обходной путь, и это означает, что у вас должен быть статический метод для выполнения собственных запросов.Я бы предложил отделить понятие «расстояние» от вашей сущности «Вопрос», если это возможно, в ваших требованиях, и при необходимости вычислить его либо с помощью вызова собственной функции SQL, либо с помощью метода службы.

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