为了向数据库中的对象添加标签,似乎是采用以下方案的常用方法:
有一个实体有一些属性和许多标签可以添加到它们。 可以说有三个表:
表格元素包含列ID和NAME(以及其他一些值),
表格标有TAGID和TAGNAME和
的列
带有TAGID和ELEMENTID的表TagToElement,用于将标签分配给元素。
我想知道,这是从数据库读取元素的好方法,这些元素具有分配给它们的特定标记。我的意思是,Jooq的条件如何只过滤掉已分配特定标签的ELements。
只有一次访问数据库才能实现这一点吗?
问候
麦克
答案 0 :(得分:0)
与jOOQ一样,您首先应该问自己的问题是:“我将如何在SQL中编写它?”。在SQL中,你要写
SELECT *
FROM Element
WHERE EXISTS (
SELECT 1
FROM Tags
JOIN TagsToElement
ON Tags.TAGID = TagsToElement.TAGID
WHERE Element.ID = TagsToElement.ELEMENTID
AND Tags.TAGNAME = 'Specific Name'
)
将上述1:1翻译为jOOQ:
// import static org.jooq.impl.DSL.*; is assumed
DSL.using(configuration)
.selectFrom(Element)
.whereExists(
selectOne()
.from(Tags)
.join(TagsToElement)
.on(Tags.TAGID.eq(TagsToElement.TAGID))
.where(Element.ID.eq(TagsToElement.ELEMENTID))
.and(Tags.TAGNAME.eq("Specific Name"))
)
显然,您可以使用IN
谓词而不是EXISTS
谓词来表达您的半连接。