【问题标题】:Spring Data JPA findAllBy ... in ... orderBy input listSpring Data JPA findAllBy ... in ... orderBy 输入列表
【发布时间】:2019-02-15 04:19:47
【问题描述】:

我在 Kotlin/Java 中使用 JPA 和 Spring Boot。我正在尝试找到正确有效的方法来执行 findBy ... In OrderBy 输入。

我得到了一个我想要查找的 ID 列表,并且我想要一个具有相同顺序的有序输出。这是 JPA 允许的:

@Repository
interface PhotoRepository : JpaRepository<Photo, String>{
    // Which is the same as this query
    @Query("SELECT p FROM Photo p where p.id in :var1")
    fun findAllByIdIn(var1: List<String>, pageable: Pageable): List<Photo>
}

如果 JPA 允许您执行以下操作,那就太好了:

@Repository
interface PhotoRepository : JpaRepository<Photo, String>{
    @Query("SELECT p FROM Photo p where p.id in :var1 order by :var1")
    fun findAllByIdInOrderByvar1(var1: List<String>, pageable: Pageable): List<Photo>
}

id 列表的大小在 500-1500 项之间。数据库中有很多记录,选择所有记录的想法是不可行的

考虑的解决方案是做一个findAllByIdIn,然后将记录与列表中的ID匹配,我认为这不是正确的解决方案,还有额外的操作。改变数据库的想法也在考虑之中。

【问题讨论】:

  • 我不明白你说“order by :var1”的第二个例子,因为 var1 是一个列表。
  • 是的,这个想法是查询将类似于:“SELECT p FROM Photo p where p.id in (1,2,3) order by FIELD(1,2,3)”来自MySQL 8
  • so "nativeQuery=true" 在 Query 注释中使用这样的查询不是一个选项?
  • "JPA" 不执行名为 "findXXX" 的方法;那就是 Spring Data JPA

标签: java mysql kotlin spring-data-jpa jpql


【解决方案1】:

一旦你得到了某个 id 中的所有物品,findAllByIdIn,为了得到正确的顺序,我使用了以下方法:

private fun getOrderedItemsFromOneListToAnother(photosOrder: List<String>, 
                                                photosFound: List<Photo>): List<Photo>{
    val mapStringIdsOrder = photosOrder.mapIndexed { index, s ->  s to index}.toMap()

    Collections.sort(photosFound, Comparator { o1: Photo, o2: Photo->
        Integer.compare(mapStringIdsOrder.getOrDefault(o1.id,photosOrder.size), 
        mapStringIdsOrder.getOrDefault(o2.id, photosOrder.size))})

    return photosOrder
}

【讨论】:

    猜你喜欢
    • 2016-09-12
    • 2021-11-04
    • 2018-06-13
    • 2019-02-16
    • 2022-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多