Java 用于从多个项目对象实例检索公共标记的HQL查询

Java 用于从多个项目对象实例检索公共标记的HQL查询,java,sql,hql,Java,Sql,Hql,假设我有一个查询,该查询获取以下列表项对象,其中包含一组标记,如下所示: Item1{TagSet{tag1,tag2,tag3}} Item2{TagSet{tag3,tag4,tag5}} Item3{TagSet{tag6,tag7,tag8}} Item1 Item2 Item3 are instances of Item object in List TagSet is Set Collection object 什么样的HQL或SQL查询将检索包含tag3的项目列表,并从该结果

假设我有一个查询,该查询获取以下列表项对象,其中包含一组标记,如下所示:

Item1{TagSet{tag1,tag2,tag3}}
Item2{TagSet{tag3,tag4,tag5}}
Item3{TagSet{tag6,tag7,tag8}}

Item1 Item2 Item3 are instances of Item object in List 
TagSet is Set Collection object
什么样的HQL或SQL查询将检索包含tag3的
项目列表,并从该结果
获取包含tag3的数千个项目的所有标记列表(
不包括tag3
),例如从上述3个项目

预期结果将是:

TagSet{tag1, tag2, tag4, tag5}

你没有给我们你的模式,所以我在这里猜,但是

SQL:

HQL:

然后使用tag.getItem()获取返回的标记的项目

select distinct *
from item
join tag on tag.item_id = item.id
where item.name = 'foo'
and tag.name != 'tag3'
and item.id in (select item_id from tag where name = 'tag3');
entityManager
.createQuery("
    select t
    from Tag t
    where t.name != 'tag3'
    and t.item in (select t2.item from Tag t2 where t2.name = 'Tag3')
    and t.item.name = :name")
.setParateter("name", "foo")
.getResultList();