কখনও কখনও, আপনার এমন তিনটি বা তার বেশি টেবিলের একটি সেট থেকে কোয়েরি করার প্রয়োজন হতে পারে, যেগুলো সবই একে অপরের সাথে সম্পর্কিত। সেক্ষেত্রে, আপনি টেবিলগুলোর মধ্যে নেস্টেড রিলেশনশিপ বা নেস্টেড সম্পর্ক সংজ্ঞায়িত করেন।
ধরা যাক, মিউজিক স্ট্রিমিং অ্যাপের উদাহরণে, আপনি সমস্ত ব্যবহারকারী, প্রত্যেক ব্যবহারকারীর জন্য সমস্ত প্লেলিস্ট এবং প্রত্যেক ব্যবহারকারীর প্রতিটি প্লেলিস্টের সমস্ত গান কোয়েরি করতে চান। ব্যবহারকারীদের সাথে প্লেলিস্টের একটি ওয়ান-টু-মেনি সম্পর্ক রয়েছে, এবং প্লেলিস্টের সাথে গানের একটি মেনি-টু-মেনি সম্পর্ক রয়েছে। নিম্নলিখিত কোড উদাহরণটি সেই ক্লাসগুলো দেখায় যা এই সত্তাগুলোকে উপস্থাপন করে, সেইসাথে প্লেলিস্ট এবং গানের মধ্যে মেনি-টু-মেনি সম্পর্কের জন্য ক্রস-রেফারেন্স টেবিলটিও দেখায়:
@Entity data class User( @PrimaryKey val userId: Long, val name: String, val age: Int ) @Entity data class Playlist( @PrimaryKey val playlistId: Long, val userCreatorId: Long, val playlistName: String ) @Entity data class Song( @PrimaryKey val songId: Long, val songName: String, val artist: String ) @Entity(primaryKeys = ["playlistId", "songId"], indices = [Index("playlistId", "songId")]) data class PlaylistSongCrossRef( val playlistId: Long, val songId: Long )
প্রথমে, একটি ডেটা ক্লাস এবং @Relation অ্যানোটেশন ব্যবহার করে, আপনার সেটের দুটি টেবিলের মধ্যেকার সম্পর্কটি স্বাভাবিকভাবে মডেল করুন। নিম্নলিখিত উদাহরণটি একটি PlaylistWithSongs ক্লাস দেখাচ্ছে যা Playlist এনটিটি ক্লাস এবং Song এনটিটি ক্লাসের মধ্যে একটি মেনি-টু-মেনি সম্পর্ক মডেল করে:
data class PlaylistWithSongs( @Embedded val playlist: Playlist, @Relation( parentColumns = ["playlistId"], entityColumns = ["songId"], associateBy = Junction(PlaylistSongCrossRef::class) ) val songs: List<Song> )
এই সম্পর্কটিকে উপস্থাপন করে এমন একটি ডেটা ক্লাস সংজ্ঞায়িত করার পরে, আপনার সেটের অন্য একটি টেবিল এবং প্রথম রিলেশনশিপ ক্লাসের মধ্যেকার সম্পর্ককে মডেল করে এমন আরেকটি ডেটা ক্লাস তৈরি করুন, যেখানে বিদ্যমান সম্পর্কটিকে নতুনটির মধ্যে "নেস্ট" করা থাকবে। নিম্নলিখিত উদাহরণটি একটি UserWithPlaylistsAndSongs ক্লাস দেখায় যা User এনটিটি ক্লাস এবং PlaylistWithSongs রিলেশনশিপ ক্লাসের মধ্যে একটি ওয়ান-টু-মেনি সম্পর্ককে মডেল করে:
data class UserWithPlaylistsAndSongs( @Embedded val user: User, @Relation( entity = Playlist::class, parentColumns = ["userId"], entityColumns = ["userCreatorId"] ) val playlists: List<PlaylistWithSongs> )
UserWithPlaylistsAndSongs ক্লাসটি পরোক্ষভাবে User , Playlist এবং Song এই তিনটি এনটিটি ক্লাসের মধ্যকার সম্পর্ককে মডেল করে। এটি চিত্র ১-এ দেখানো হয়েছে।

আপনার সেটে যদি একাধিক টেবিল থাকে, তবে প্রতিটি অবশিষ্ট টেবিল এবং পূর্ববর্তী রিলেশনশিপ ক্লাসের মধ্যেকার সম্পর্ক মডেল করার জন্য একটি ক্লাস তৈরি করুন। এই প্রক্রিয়াটি আপনার কোয়েরি করতে চাওয়া সমস্ত টেবিলের মধ্যে একটি নেস্টেড সম্পর্কের শৃঙ্খল তৈরি করে।
অবশেষে, আপনার অ্যাপের প্রয়োজনীয় কোয়েরি ফাংশনটি প্রকাশ করার জন্য ডেটা অ্যাক্সেস অবজেক্ট (DAO) ক্লাসে একটি ফাংশন যোগ করুন। এই ফাংশনটির একাধিক কোয়েরি চালানোর জন্য Room প্রয়োজন, তাই @Transaction অ্যানোটেশনটি যোগ করুন যাতে সম্পূর্ণ অপারেশনটি অ্যাটমিকভাবে চলে:
@Transaction @Query("SELECT * FROM User") suspend fun getUsersWithPlaylistsAndSongs(): List<UserWithPlaylistsAndSongs>