มีวิธีควบคุมลำดับของเอนทิตีลูกเมื่อใช้ความสัมพันธ์แบบหนึ่งต่อกลุ่มหรือไม่?

ตาม https://developer.android.com/training/data-storage/room/relationships

เราสามารถมีความสัมพันธ์แบบหนึ่งต่อกลุ่มได้

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();

ในเอนทิตี User และ Playlist เราได้เพิ่มคอลัมน์ชื่อ sort_key

จุดประสงค์คือเมื่อเราทำการสืบค้นเราสามารถทำสิ่งต่อไปนี้ได้

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

เราสามารถควบคุมลำดับของ List<UserWithPlaylists> ได้

แต่แล้วเอนทิตีลูก List<Playlist> playlists ล่ะ?

เราจะกำหนดการสืบค้นแบบกำหนดเองสำหรับเอนทิตีลูก Playlist เพื่อให้เราสามารถควบคุมการสั่งซื้อ List<Playlist> playlists ได้อย่างไร


person Cheok Yan Cheng    schedule 25.05.2020    source แหล่งที่มา


คำตอบ (3)


เราจะกำหนดการสืบค้นที่กำหนดเองสำหรับเพลย์ลิสต์เอนทิตีลูกได้อย่างไร เพื่อให้เราควบคุมการเรียงลำดับเพลย์ลิสต์ได้

ฉันเกรงว่าจะไม่มีทางนอกกรอบที่นี่

การใช้คำอธิบายประกอบ @Relation สิ่งที่คุณมีคือ:

  • พารามิเตอร์ของคำอธิบายประกอบ 5 รายการ (associateBy, เอนทิตี, entityColumn, parentColumn, การฉายภาพ ไม่มีสิ่งใดมีอิทธิพลต่อลำดับของรายการในตารางลูก)

  • ภายใต้ประทุนของห้องความสัมพันธ์ใช้สองแบบสอบถาม - ขั้นแรกคุณต้องเขียนอย่างชัดเจนใน DAO ของคุณ

SELECT * FROM User order by sort_key

และอีกประการหนึ่ง - สำหรับการดึงข้อมูลจากตารางลูก (ขึ้นอยู่กับประเภทของผลลัพธ์ของการสืบค้นและตามพารามิเตอร์ @Relation):

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

ข้อความค้นหานี้ถูกสร้างขึ้นโดยอัตโนมัติ และคำอธิบายประกอบ @Relation ของคุณไม่มีตัวเลือกในการเปลี่ยนแปลงลำดับของรายการ

แน่นอนว่า หลังจากได้รับผลลัพธ์ "แบบไม่เรียงลำดับ" แล้ว คุณสามารถเพิ่มขั้นตอนหลังการประมวลผลเพื่อให้ได้สิ่งที่คุณต้องการด้วยตนเอง

person sergiy tikhonov    schedule 25.05.2020

ฉันไม่แน่ใจ เป็นไปได้ที่จะเพิ่ม @Query ลงในฟิลด์ แต่สิ่งที่ฉันแน่ใจคือคุณสามารถใช้คอลเลกชันเฉพาะเพื่อทำการสั่งซื้อได้ เหล่านี้คือขั้นตอน:

  1. สร้างอินเทอร์เฟซ Playlist การเพิ่มเอนทิตี Comparable จากนั้นกำหนดวิธีการ compareTo ตามแอตทริบิวต์ sort_key

  2. แทนที่จะเป็นรายการในเอนทิตี UserWithPlaylists ให้ใช้ SortedSet หรือ TreeSet คอลเลกชันเฉพาะนี้จะส่งคืนรายการที่สั่งซื้อโดยใช้ลำดับธรรมชาติหรือตัวเปรียบเทียบ

person Kenany    schedule 30.05.2020

คุณสามารถใช้ฟังก์ชันนี้ได้สองวิธี:

1) คุณสามารถใช้คำอธิบายประกอบ @Sort เฉพาะไฮเบอร์เนตเพื่อดำเนินการเรียงลำดับในหน่วยความจำ (เช่น ไม่ได้อยู่ในฐานข้อมูล) โดยใช้การเรียงลำดับตามธรรมชาติหรือการเรียงลำดับโดยใช้ตัวเปรียบเทียบที่คุณระบุ ตัวอย่างเช่น สมมติว่าฉันมีคลาสตัวช่วย MyComparator ที่ใช้ Comparator คลาส Helper สามารถช่วยคุณจัดเรียงตาม sort_key คุณสามารถเปลี่ยนคอลเลกชันเพลย์ลิสต์ได้ดังนี้:

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

@Sort จะดำเนินการเรียงลำดับในหน่วยความจำเมื่อดึงข้อมูลคอลเลกชันจากฐานข้อมูลแล้ว

2) คุณสามารถใช้คำอธิบายประกอบ @OrderBy ของไฮเบอร์เนต ซึ่งช่วยให้คุณระบุส่วนของ SQL ที่อธิบายวิธีการเรียงลำดับได้

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

หวังว่าจะช่วยได้..!!

person karan007    schedule 03.06.2020