Получение ошибки, org. postgresql .util.PSQLException: ОШИБКА: синтаксическая ошибка в или около "." при попытке передать список новому классу в спящем режиме - PullRequest
1 голос
/ 09 февраля 2020

Я хотел бы создать список с классами в запросе 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
}

1 Ответ

0 голосов
/ 09 февраля 2020

Основная цель проекции DTO - эффективно отобразить кортеж в класс DTO. Я не думаю, что это работает с ассоциациями.

Теперь, чтобы исправить вашу конкретную проблему, вот что я бы сделал:

  1. Измените запрос только на объект вопроса выбора
@Query("SELECT new com.my.class.Projection(q) FROM Question q WHERE q.form = :form")
Затем измените Projection конструктор
constructor(q: Question) : this(id, otherId) {
    this.id = q.id
    this.otherId = q.otherId
    this.votes = q.votes.map { VoteProjection(it.id, if (it.user !== null) VoteGuestProjection(it.user!!.id) else null) }
}

Это будет работать, хотя я не думаю, что это лучший способ. Похоже, вы хотите выполнить какое-то преобразование, которое является целью ResultTransformer .

...