gpt4 book ai didi

java - 尝试将列表传递给 hibernate 中的新类时出现错误,org.postgresql.util.PSQLException : ERROR: syntax error at or near "." ,

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:48 25 4
gpt4 key购买 nike

我想在 HQL 查询中构造一个包含类的列表,但每当我尝试将列表传递给新类时,SQL 生成都会失败,并告诉我 org.postgresql.util.PSQLException: ERROR: syntax error at or near "." 。最终结果应该是一个 Form 对象列表,其中每个 Form 包含一个投票列表。

如果我以 SELECT new com.my.class.Projection(q.id, q.otherId, q.votes) 开始查询,q.votes 将生成为 .在 SQL 中这会导致错误。但是,如果我将投影的投票列表更改为 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
}

最佳答案

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 的目的.

    关于java - 尝试将列表传递给 hibernate 中的新类时出现错误,org.postgresql.util.PSQLException : ERROR: syntax error at or near "." ,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60137540/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com