Exposed icon indicating copy to clipboard operation
Exposed copied to clipboard

How to build find query with find by many-to-many reference?

Open zxcqirara opened this issue 3 years ago • 2 comments

I need to build find query but use many-to-many reference value as filter, but tables hasn't many-to-many references

zxcqirara avatar Aug 27 '22 18:08 zxcqirara

Could you provide what your tables look like and what query would you like to write, so we could help you better?

AlexeySoshin avatar Aug 31 '22 15:08 AlexeySoshin

Also, please check Join part of Wiki, full join syntax can help you.

Tapac avatar Sep 15 '22 17:09 Tapac

Also, please check Join part of Wiki, full join syntax can help you.

Hello, sorry for late answer, it's because I forgot about my project for some time. I need DAO syntax cuze I using referring to another entity.

Here is my tables & entities declarations:

object Servers : FlakeUUIDTable("servers") {
	val name = text("name")
	val description = text("description")
	val link = text("link").nullable()
	val privacy = enumeration<ServerPrivacy>("privacy").default(ServerPrivacy.PUBLIC)
	val owner = reference("owner", Users)
}

class Server(id: EntityID<UUID>) : FlakeUUIDEntity(id, Servers) {
	companion object : UUIDEntityClass<Server>(Servers)

	var name by Servers.name
	var description by Servers.description
	var link by Servers.link
	var privacy by Servers.privacy
	var owner by User referencedOn Servers.owner
	val categories by Category referrersOn Categories.server
	var members by User via Members
}
object Users : FlakeUUIDTable("users") {
	val login = text("login")
	val password = text("password")
	val username = text("username")
	val link = text("link").nullable()
	val locale = enumeration<LanguageRegion>("locale")
	val flags = integer("flags").default(0)
	val isBanned = bool("is_banned").default(false)
}

class User(id: EntityID<UUID>) : FlakeUUIDEntity(id, Users) {
	companion object : UUIDEntityClass<User>(Users)

	var login by Users.login
	var password by Users.password
	var username by Users.username
	var link by Users.link
	var locale by Users.locale
	var flags by Users.flags
	var isBanned by Users.isBanned
}
object Members : Table("members") {
	val user = reference("user", Users)
	val server = reference("server", Servers)
	val joinedAt = timestamp("joined_at")
}

So I need to find all Servers that contains User (see members field)

zxcqirara avatar Nov 10 '22 20:11 zxcqirara

val query = Servers.innerJoin(User).innerJoin(Member).
    slice(Servers.columns).
    selectAll().
    withDistinct()
val servers = Server.wrapRows(query)

Tapac avatar Nov 11 '22 23:11 Tapac

val query = Servers.innerJoin(User).innerJoin(Member).
    slice(Servers.columns).
    selectAll().
    withDistinct()
val servers = Server.wrapRows(query)

I little edited this code for me, now it looks so:

val query = (Servers innerJoin Members)
	.slice(Servers.columns)
	.selectAll()
	.withDistinct()

Server.wrapRows(query).map { it.toObject() }

zxcqirara avatar Nov 12 '22 23:11 zxcqirara