gpt4 book ai didi

java - 如何将spring数据jpa规范查询中的distinct和sort与join结合起来

转载 作者:行者123 更新时间:2023-12-01 11:19:37 24 4
gpt4 key购买 nike

示例设置:

实体

@Entity
class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null

@ManyToMany(cascade = [CascadeType.PERSIST, CascadeType.MERGE])
@JoinTable(name = "book_authors",
joinColumns = [JoinColumn(name = "book_id")],
inverseJoinColumns = [JoinColumn(name = "author_id")])
var authors: MutableSet<Author> = HashSet()

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "publisher_id")
lateinit var publisher: Publisher
}

Author 和 Publisher 都是简单的实体,只有一个 id 和一个名称。

spring 数据 jpa BookSpecification:(注意查询的不同)
fun hasAuthors(authorNames: Array<String>? = null): Specification<Book> {
return Specification { root, query, builder ->
query.distinct(true)
val matchingAuthors = authorRepository.findAllByNameIn(authorNames)
if (matchingAuthors.isNotEmpty()) {
val joinSet = root.joinSet<Book, Author>("authors", JoinType.LEFT)
builder.or(joinSet.`in`(matchingContentVersions))
} else {
builder.disjunction()
}
}
}

执行查询(可分页包含对publisher.name 的排序)
bookRepository.findAll(
Specification.where(bookSpecification.hasAuthors(searchRequest)),
pageable!!)

REST 请求:
MockMvcRequestBuilders.get("/books?authors=Jane,John&sort=publisherName,desc")

这会导致以下错误:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Order by expression "PUBLISHERO3_.NAME" must be in the result list in this case;

问题在于distinct 和sort 的组合。不同的要求发布者名称位于选择字段中才能进行排序。

如何使用规范查询解决此问题?

最佳答案

您可能必须明确选择 PUBLISHERO3_.NAME像这样的列:

query.select(builder.array(root.get("PUBLISHERO3_.NAME"), root.get("yourColumnHere")));

默认情况下可能不包括连接的列,因为它们超出了根泛型类型的范围。

关于java - 如何将spring数据jpa规范查询中的distinct和sort与join结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60342247/

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