Я хотел бы создать список с классами в запросе HQL, но всякий раз, когда я пытаюсь передать список новому классу, генерация SQL завершается неудачно, сообщая мне org.postgresql.util.PSQLException: ERROR: syntax error at or near "."
. Конечным результатом должен быть список объектов Form, где каждая форма содержит список голосов.
Если я начну запрос с SELECT new com.my.class.Projection(q.id, q.otherId, q.votes)
, q.votes будет сгенерирован как .
в SQL что приводит к ошибке. Однако, если я изменю список голосов Projection на int (и изменив запрос на SELECT new com.my.class.Projection(q.id, q.otherId, q.votes.size)
просто для получения размера, он скажет мне, какой это размер. Почему я могу получить количество голосов, но не сам список? Любая помощь будет высоко ценится!
Часть SQL, которая будет сгенерирована:
Hibernate: select question0_.id as col_0_0_, question0_.other_id as col_1_0_, . as col_2_0_ from public.questions`
Исходный код:
Хранилище вопросов
interface QuestionRepository : JpaRepository<Question, Long> {
@Query("SELECT new com.my.class.Projection(q.id, q.otherId, q.votes) FROM Question q WHERE q.form = :form")
fun findQuestionSimple(@Param("form") form: Form): List<Projection>
Проекция
data class Projection(
var id: Long = 0,
var otherId: String
) {
@OneToMany(mappedBy = "question")
var votes: List<VoteProjection>? = listOf()
constructor(id: Long, otherId: String, votes: List<Vote>) : this(id, otherId) {
this.id = id
this.otherId = otherId
this.votes = votes.map { VoteProjection(it.id, if (it.user !== null) VoteGuestProjection(it.user!!.id) else null) }
}
}
data class VoteProjection(
var id: Long = 0,
var user: VoteUserProjection?
)
data class VoteUserProjection(
var id: Long = 0
)
Класс вопросов
@Entity
@Table(name = "questions", schema = "PUBLIC")
class Question {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = 0
@NotNull
var otherId = ""
@ManyToOne
@JsonIgnore
@JoinColumn
var form: Form? = null
@OneToMany(mappedBy = "form")
@JsonIgnoreProperties("form")
var votes: List<Vote> = listOf()
}
Класс голосования
@Entity
@Table(name = "votes", schema = "PUBLIC")
class Vote {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = 0
@ManyToOne
@JoinColumn
var user: User? = null // Not relevant for this question
}