Hibernate HQL来判断值是否在联接表中

Hibernate HQL来判断值是否在联接表中,hibernate,hql,Hibernate,Hql,我有两个实体表(Scenario和Tag)和一个表示多对多关系的联接表。使用Scenario作为基表,我创建了一条sql语句,允许我查看标记是否是与单个场景关联的标记集的一部分,并输出具有该标记的所有场景: select count(*) from scenarios where scenarios.id not in ( select tag_to_scenarios.scenarioid from tag_to_scenarios join tags ON tags.

我有两个实体表(Scenario和Tag)和一个表示多对多关系的联接表。使用Scenario作为基表,我创建了一条sql语句,允许我查看标记是否是与单个场景关联的标记集的一部分,并输出具有该标记的所有场景:

select count(*)
from scenarios
where scenarios.id not in (
    select tag_to_scenarios.scenarioid
    from tag_to_scenarios
    join tags ON tags.id = tag_to_scenarios.tagid
    where (
        exists( 
            select concat(group_concat(tags.tagname), ',') as tag_list
            from scenarios as sub_scenarios
            left outer join tag_to_scenarios ON tag_to_scenarios.scenarioid = sub_scenarios.id
            join tags ON tags.id = tag_to_scenarios.tagid
            where scenarios.id = sub_scenarios.id
            group by scenarios.id
            having (position('@regression,' in tag_list) = 0))
        )
    )
 );
以下是所使用模型的相关部分:

@Entity
@Table(name="tags")
public class Tag {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

public void setId(int id) {
    this.id = id;
}

public int getId() {
    return id;
}

@NotNull
@Column(name = "tagname")
private String tagName;

public void setTagName(String tagName) {
    this.tagName = tagName;
}

public String getTagName() {
    return tagName;
}

}

@Entity
@表(name=“场景”) 公共类场景{

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

public int getId() {
    return this.id;
}

public void setId(int id) {
    this.id = id;
}
...
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "tag_to_scenarios",
    joinColumns = {@JoinColumn(name = "scenarioid", nullable = false, updatable = false)},
    inverseJoinColumns = {@JoinColumn(name = "tagid", nullable = false, updatable = false)},
    uniqueConstraints = @UniqueConstraint(name = "scenarioid", columnNames = {"tagid"})
)
private Set<Tag> tags = new HashSet<Tag>(0);

public Set<Tag>  getTags() {
    return this.tags;
}

public void setTags(Set<Tag> tags) {
    this.tags = tags;
}
}
@Id
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
公共int getId(){
返回此.id;
}
公共无效集合id(内部id){
this.id=id;
}
...
@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinTable(name=“标记到场景”,
joinColumns={@JoinColumn(name=“scenarioid”,nullable=false,updateable=false)},
inverseJoinColumns={@JoinColumn(name=“tagid”,nullable=false,updateable=false)},
uniqueConstraints=@UniqueConstraint(name=“scenarioid”,columnNames={“tagid”})
)
私有集标记=新哈希集(0);
公共集getTags(){
返回此.tags;
}
公共无效集合标记(集合标记){
this.tags=标签;
}
}

我需要将此SQL语句转换为HQL,因为我的模型中没有联接表。

老实说,我不理解您的SQL查询,但如果您只想获得具有给定标志的场景,那么以下HQL查询就足够了:

SELECT s.id FROM Scenario s JOIN tags t WHERE t.tagName = :tagName

以下HQL可帮助您完成此任务:

  SELECT s from Scenario s
    JOIN s.tags t 
   WHERE t.name = :tag 
GROUP BY s 
  HAVING count(t) = 1
学分来自以下网站: