使用JOOQ读取标记对象的推荐方法是什么?

时间:2013-09-02 14:35:55

标签: java sql jooq

为了向数据库中的对象添加标签,似乎是采用以下方案的常用方法:

有一个实体有一些属性和许多标签可以添加到它们。 可以说有三个表:

表格元素包含列ID和NAME(以及其他一些值),
 表格标有TAGID和TAGNAME和
的列  带有TAGID和ELEMENTID的表TagToElement,用于将标签分配给元素。

我想知道,这是从数据库读取元素的好方法,这些元素具有分配给它们的特定标记。我的意思是,Jooq的条件如何只过滤掉已分配特定标签的ELements。

只有一次访问数据库才能实现这一点吗?

问候

麦克

1 个答案:

答案 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谓词来表达您的半连接。