Apakah ada cara untuk mengontrol urutan entitas anak, saat menggunakan hubungan satu-ke-banyak?

Menurut https://developer.android.com/training/data-storage/room/relationships

Kita bisa memiliki hubungan satu-ke-banyak

public class UserWithPlaylists {
    @Embedded public User user;
    @Relation(
         parentColumn = "userId",
         entityColumn = "userCreatorId"
    )
    public List<Playlist> playlists;
}

@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();

Di entitas User dan Playlist, kami telah menambahkan kolom bernama sort_key

Tujuannya adalah, ketika kita melakukan query, kita bisa melakukan hal berikut

@Transaction
@Query("SELECT * FROM User order by sort_key")
public List<UserWithPlaylists> getUsersWithPlaylists();

Kita dapat mengontrol urutan List<UserWithPlaylists>.

Tapi, bagaimana dengan List<Playlist> playlists entitas anak?

Bagaimana kita dapat menentukan kueri khusus untuk entitas anak Playlist, sehingga kita dapat memiliki kendali atas pengurutan List<Playlist> playlists?


person Cheok Yan Cheng    schedule 25.05.2020    source sumber


Jawaban (3)


Bagaimana kita dapat menentukan kueri khusus untuk Daftar Putar entitas anak, sehingga kita dapat memiliki kontrol atas pengurutan daftar putar Daftar?

Saya khawatir tidak ada cara out-of-box di sini.

Dengan menggunakan anotasi @Relation yang Anda miliki hanyalah:

  • 5 parameter anotasi (associateBy, entitas, entityColumn, parentColumn, proyeksi. Tak satu pun dari mereka memiliki pengaruh pada urutan item tabel anak)

  • Di balik terpal Relasi, Ruangan menggunakan dua kueri - pertama, Anda menulis secara eksplisit di DAO Anda

SELECT * FROM User order by sort_key

dan satu lagi - untuk mengambil data dari tabel anak (berdasarkan jenis hasil kueri dan parameter @Relation):

SELECT * FROM PlayList WHERE userCreatorId IN (<List of users id from the first query>)

Kueri ini dibuat secara otomatis dan anotasi @Relation Anda tidak memiliki opsi untuk mengubah urutan item di dalamnya.

Tentu saja, setelah mendapatkan hasil "tidak berurutan" ini Anda dapat menambahkan beberapa pasca-pemrosesan untuk mencapai apa yang Anda inginkan secara manual

person sergiy tikhonov    schedule 25.05.2020

Saya tidak yakin apakah mungkin untuk menambahkan @Query ke suatu bidang tetapi yang saya yakin adalah Anda dapat menggunakan koleksi tertentu untuk membuat pesanan. Berikut langkah-langkahnya:

  1. Buat antarmuka Playlist implementasi entitas Comparable, lalu tentukan metode compareTo mengikuti atribut sort_key.

  2. Alih-alih daftar di entitas UserWithPlaylists, gunakan SortedSet atau TreeSet koleksi khusus ini mengembalikan item yang diurutkan menggunakan urutan alami atau Pembanding.

person Kenany    schedule 30.05.2020

Anda dapat mengimplementasikan fungsi ini dengan dua cara:

1) Anda dapat menggunakan anotasi @Sort khusus Hibernate untuk melakukan penyortiran dalam memori (yaitu bukan dalam database), menggunakan penyortiran alami atau penyortiran menggunakan Komparator yang Anda sediakan. Misalnya, asumsikan saya memiliki kelas pembantu MyComparator yang mengimplementasikan Comparator. Kelas pembantu dapat membantu Anda mengurutkan berdasarkan sort_key. Anda dapat mengubah koleksi Daftar Putar seperti ini:

@org.hibernate.annotations.Sort(type = SortType.COMPARATOR, comparator = MyComparator)
public Set<Playlist> playlists;

@Sort akan melakukan penyortiran dalam memori setelah koleksi diambil dari database.

2) Anda dapat menggunakan anotasi @OrderBy hibernasi, yang memungkinkan Anda menentukan fragmen SQL yang menjelaskan cara melakukan pengurutan.

@org.hibernate.annotations.OrderBy("sort_key")
 public Set<Playlist> playlists;

Semoga membantu..!!

person karan007    schedule 03.06.2020