के साथ रिकर्सिव पेड़ जैसी तालिका क्वेरी मेरा टेबल डेटा एक पेड़ संरचना बनाता है जहां एक पंक्ति एक ही तालिका में मूल पंक्ति को संदर्भित कर सकती है।Slick
मैं स्लिम का उपयोग करके हासिल करने की कोशिश कर रहा हूं, एक प्रश्न लिखना है जो एक पंक्ति और उसके सभी बच्चों को वापस कर देगा। इसके अलावा, मैं वही करना चाहूंगा, लेकिन एक प्रश्न लिखूंगा जो एक बच्चे और उसके सभी पूर्वजों को वापस कर देगा।
दूसरे शब्दों में:
findDown(1)
लौटना चाहिए
List(Group(1, 0, "1"), Group(3, 1, "3 (Child of 1)"))
findUp(5)
लौटना चाहिए
List(Group(5, 2, "5 (Child of 2)"), Group(2, 0, "2"))
यहाँ एक पूरी तरह कार्यात्मक वर्कशीट (लापता समाधान ;-) के अलावा है।
package com.exp.worksheets
import scala.slick.driver.H2Driver.simple._
object ParentChildTreeLookup {
implicit val session = Database.forURL("jdbc:h2:mem:test1;", driver = "org.h2.Driver").createSession()
session.withTransaction {
Groups.ddl.create
}
Groups.insertAll(
Group(1, 0, "1"),
Group(2, 0, "2"),
Group(3, 1, "3 (Child of 1)"),
Group(4, 3, "4 (Child of 3)"),
Group(5, 2, "5 (Child of 2)"),
Group(6, 2, "6 (Child of 2)"))
case class Group(
id: Long = -1,
id_parent: Long = -1,
label: String = "")
object Groups extends Table[Group]("GROUPS") {
def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
def id_parent = column[Long]("ID_PARENT")
def label = column[String]("LABEL")
def * = id ~ id_parent ~ label <> (Group, Group.unapply _)
def autoInc = id_parent ~ label returning id into {
case ((_, _), id) => id
}
def findDown(groupId: Long)(implicit session: Session) = { ??? }
def findUp(groupId: Long)(implicit session: Session) = { ??? }
}
}
एक findDown
पर वास्तव में बुरा है, और स्थिर प्रयास की तरह कुछ हो सकता है:
private def groupsById = for {
group_id <- Parameters[Long]
g <- Groups; if g.id === group_id
} yield g
private def childrenByParentId = for {
parent_id <- Parameters[Long]
g <- Groups; if g.id_parent === parent_id
} yield g
def findDown(groupId: Long)(implicit session: Session) = { groupsById(groupId).list union childrenByParentId(groupId).list }
लेकिन, मुझे आईडी और id_parent का उपयोग कर स्लिक के लिए एक तरह से रिकर्सिवली एक ही तालिका में खोज करने के लिए देख रहा हूँ संपर्क। समस्या को हल करने के लिए कोई अन्य अच्छे तरीके वास्तव में स्वागत है। हालांकि ध्यान रखें, डेटाबेस राउंड-ट्रिप की संख्या को कम करना सबसे अच्छा होगा।
आप एसक्यूएल में ऐसा कैसे करेंगे? – EECOLOR