Как использовать @formula, не запрашивая ту же таблицу - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь получить данные из таблицы профиля из сущности @Vote.

@Entity
@Table(name = "vote")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Vote implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;

@NotNull
@Column(name = "creation_date", nullable = false)
private Instant creationDate;

@Column(name = "number_of_points")
private Integer numberOfPoints;

@ManyToOne(optional = false)
@NotNull
@JsonIgnoreProperties("")
private User user;

@ManyToOne(optional = false)
@NotNull
@JsonIgnoreProperties("votes")
private Proposal proposal;

@Formula("(SELECT SUM(number_of_points) FROM VOTE WHERE VOTE.USER_ID = USER_ID)")
int totalVotes;

@Formula("(SELECT USER_POINTS FROM PROFILE WHERE PROFILE.USER_ID = 1)")
Long userVotes;

Он работает в той же таблице, как если бы я запрашивал данные голосования, как в этом случае ...

@Formula("(SELECT SUM(number_of_points) FROM VOTE WHERE VOTE.USER_ID = USER_ID)")
int totalVotes;

но не тогда, когда я спрашиваю

@Formula("(SELECT USER_POINTS FROM PROFILE WHERE PROFILE.USER_ID = 1)")
Long userVotes;

и я не могу найти документацию, в которой говорится, что есть ограничение. Спасибо

PD: Кстати, оператор SQL работает в базе данных.

entity User{
}

entity Profile {
    creationDate Instant required
    image ImageBlob
    userPoints Long min(100)
}

entity Vote {
    creationDate Instant required
    numberOfPoints Integer
}

// RELATIONSHIPS:
relationship OneToOne {
    Profile{user(id) required} to User{profile}
}

relationship ManyToOne {
    Vote{user(id) required} to User
}

1 Ответ

0 голосов
/ 04 июля 2018

Попробуйте с этим подходом, надеюсь, он будет работать для вас.

    @ManyToOne
    @JoinColumnsOrFormulas({
        @JoinColumnOrFormula(formula=@JoinFormula(value="(SELECT r.id FROM Result r WHERE resultDate = (SELECT MAX(sqr.resultDate) FROM Result sqr WHERE sqr.test_id = id))", referencedColumnName="id")),
    })
private Long userVotes;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...