当前位置: 首页 > 知识库问答 >
问题:

如何在spring data jpa规范查询中结合distinct和sort与joins

吉毅
2023-03-14

示例设置:

@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
}
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()
        }
    }
}
bookRepository.findAll(
    Specification.where(bookSpecification.hasAuthors(searchRequest)),
    pageable!!)
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的结合。distinct要求发布服务器名称位于选择字段中,以便能够进行排序

我如何用规范查询解决这个问题?

共有1个答案

喻昀
2023-03-14

您可能必须显式地选择publishero3_.name列,如下所示:

java prettyprint-override">query.select(builder.array(root.get("PUBLISHERO3_.NAME"), root.get("yourColumnHere")));

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

 类似资料:
  • 应查找下列文件: 我尝试了以下方法: 它应该(但不是)这样工作: bool通过或和部分组合 第一个按查询选择 筛选器使用bool组合by或must_not` 但其行为类似于与via AND子句组合。例如。当我删除“must”或“must_not”时,查询工作。 如何通过OR子句更改查询以将“must”与“must_not”组合? Elasticsearch版本为

  • 我不熟悉Mongo中的聚合查询,并且一直在努力产生我想要的输出。我有以下聚合查询: 返回以下结果: 如何修改聚合查询,以便只返回2个文档而不是3个文档?将两个“ABC-123”结果合并为一个结果,并使用带有“bu”和“count”字段的新计数数组,即。 非常感谢

  • 我正在使用一个JPA查询,它使用一个规范来检索实体。当我执行查询时,我得到了一个错误: 组织。springframework。数据映射。PropertyReferenceException:找不到类型任务的属性名称! 我已经查看了之前在该网站上提出的类似问题的答案 当我使用调试器逐步检查代码时,条件生成器中的扩展路径将返回嵌入的ID类,但当规范实际用于查询时,该属性似乎正在应用于基本实体类。 我是

  • 问题内容: 好的,我刚开始使用Firebase。我已阅读:https://www.firebase.com/docs/data- structure.html, 并且已阅读:https://www.firebase.com/blog/2013-04-12-denormalizing- is- normal.html 所以我很困惑,因为一个似乎与另一个矛盾。您可以按层次结构组织数据,但是如果您想使其

  • 将elasticsearch布尔查询与范围增强相结合 因此,我尝试添加一个增强,如下所示: 这会像我想要的那样对内容进行排序,但它也会返回与搜索项不匹配的单字匹配项。 有没有一种方法可以只增强单个单词的匹配,这些匹配也与搜索项匹配?我尝试降低值,当使用有效的(找到的)搜索项时,该值会破坏所需的排序。 似乎应该有一种方法可以使用bool进行整个

  • 我试图在Spring Boot中按规范在query中跨多个属性执行搜索。当我输入一个单词要搜索时,它可以工作,但当我输入两个单词时,它不能提供正确的输出。 这是模型。 下面是生成的SQL。 我实际上希望搜索所有属性,有些属性是一个词,到文本段落。我希望搜索查询被分解成单词,这样它就可以通过名字和姓氏进行搜索,例如。