Spring Data JPA findAllBy ... в ... порядке ввода - PullRequest
0 голосов
/ 10 сентября 2018

Я использую JPA с Spring Boot в Kotlin / Java. Я пытаюсь найти правильный и эффективный способ сделать findBy ... В поле ввода OrderBy.

У меня есть список идентификаторов, которые я хочу найти, и я хочу упорядоченный вывод с тем же порядком. Это то, что 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>
}

Размер списка идентификаторов составляет от 500 до 1500 наименований. В базе данных много записей, и идея выбрать все записи неосуществима

Предполагаемое решение состоит в том, чтобы сделать findAllByIdIn и затем сопоставить записи с идентификаторами в списке, что, я думаю, не является правильным решением, есть дополнительные операции. Идея изменения базы данных также рассматривается.

1 Ответ

0 голосов
/ 18 сентября 2018

Как только вы получили все элементы с определенным идентификатором, с помощью 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
}
...