如何在 jpa 查询中调用 postgres position() 函数

Posted

技术标签:

【中文标题】如何在 jpa 查询中调用 postgres position() 函数【英文标题】:How to call postgres position() function in jpa query 【发布时间】:2022-01-15 14:01:06 【问题描述】:

我想从IN operator 中给出的 id 排序的数据库中检索帖子

我正在使用下面的 Spring Data JPA 查询从数据库中获取帖子,但是 postgres 不尊重结果中给定的postIds 列表中指定的行的顺序,并且返回的结果按postId 降序(或升序)排序没关系)

@Query("SELECT p from Post p where p.postId in (:postIds))
fun findPostByIdIn(postIds: List<Long>): List<Post>

为了保持结果的顺序,我可以使用这个查询

SELECT p from posts p where p.post_id in (10000442, 10000436, 10000440) ORDER BY POSITION(post_id::text IN '10000442, 10000436, 10000440');

我的问题是,我如何使用给定参数的 jpa 查询中的 position() 函数(这是标准的 postgresql 函数)?我必须使用本机查询吗?如果是这样,我如何在 Spring Boot 中使用本机查询? 我试过下面的查询,但他们都没有工作

@Query(
        "SELECT p from posts p where p.post_id in (:postIds) ORDER BY POSITION(p.post_id::text IN ':postIds')",
        nativeQuery = true
    )

@Query(
        "SELECT p from posts p where p.post_id in (:postIds) ORDER BY POSITION(p.post_id\\:\\:text IN ':postIds')",
        nativeQuery = true
    )
It says ` The column name post_id was not found in this ResultSet.`

【问题讨论】:

@Query("SELECT p.* from posts p where p.post_id in (:postIds) AND p.expire_at &gt;= now() ORDER BY POSITION(p.post_id\\:\\:text IN ':postIds')", nativeQuery = true) fun findNonExpiredPostByIdIn(postIds: List&lt;Long&gt;): List&lt;Post&gt; 此查询正常工作,但它按 postId 升序排序,而不是按列表中提供的顺序排序 【参考方案1】:

尝试将 List 作为返回类型而不是 List 然后检查结果内容以分析问题。

【讨论】:

没有什么可分析的,它说无法执行查询。但是,我已经在对我的问题的评论中发布了查询,

以上是关于如何在 jpa 查询中调用 postgres position() 函数的主要内容,如果未能解决你的问题,请参考以下文章

JPA Hibernate 调用 Postgres 函数 Void 返回 MappingException:

Postgres & JPA 命名查询 - WHERE 中的任何 (*) 值

JPA 支持查询 Postgres JSON 字段

Postgres Interval 不适用于本机 Spring 数据 JPA 查询

如何在 JPA 中使用 Postgres JSONB 数据类型?

Spring Batch/Data JPA 应用程序在调用 JPA 存储库(save、saveAll)方法时不会将数据持久化/保存到 Postgres 数据库