如何在 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 >= now() ORDER BY POSITION(p.post_id\\:\\:text IN ':postIds')", nativeQuery = true) fun findNonExpiredPostByIdIn(postIds: List<Long>): List<Post>
此查询正常工作,但它按 postId 升序排序,而不是按列表中提供的顺序排序
【参考方案1】:
尝试将 List
【讨论】:
没有什么可分析的,它说无法执行查询。但是,我已经在对我的问题的评论中发布了查询,以上是关于如何在 jpa 查询中调用 postgres position() 函数的主要内容,如果未能解决你的问题,请参考以下文章
JPA Hibernate 调用 Postgres 函数 Void 返回 MappingException:
Postgres & JPA 命名查询 - WHERE 中的任何 (*) 值
Postgres Interval 不适用于本机 Spring 数据 JPA 查询
如何在 JPA 中使用 Postgres JSONB 数据类型?
Spring Batch/Data JPA 应用程序在调用 JPA 存储库(save、saveAll)方法时不会将数据持久化/保存到 Postgres 数据库