【问题标题】:Join statement on HQL关于 HQL 的 Join 语句
【发布时间】:2015-06-02 09:31:44
【问题描述】:

我有一个名为 Category 和 CategorySet 的表。

CREATE TABLE CATEGORY
(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    category_name VARCHAR(40) NOT NULL,
    description VARCHAR(255),
    uuid VARCHAR(40)
);

CREATE TABLE CATEGORY_SET
(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    parent INT NOT NULL,
    child INT NOT NULL UNIQUE,
    FOREIGN KEY (parent) REFERENCES CATEGORY (id),
    FOREIGN KEY (child) REFERENCES CATEGORY (id)
);

Category.java

@Entity
@Table(name = "CATEGORY")
public class Category implements Serializable{
    @Id
    @Column(name = "ID")
    @GeneratedValue
    private Integer id;

    @Column(name = "CATEGORY_NAME", nullable = false, length = 40)
    private String name;

    @Column(name = "DESCRIPTION", nullable = false, length = 255)
    private String description;

    @Column(name = "UUID", nullable = false, length = 40)
    private String uuid;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "CATEGORY_SET", joinColumns = {@JoinColumn(name = "PARENT")}, inverseJoinColumns = {@JoinColumn(name = "CHILD")})
    private Collection<Category> subCategories = new LinkedHashSet<Category>();

    public Category(String name, String description, String uuid, Collection<Category> categorySets) {
        this.name = name;
        this.description = description;
        this.uuid = uuid;
        this.categorySets = categorySets;
    }
}

我想获取所有根类别,这意味着它们不是任何子类别。

得到结果的sql是:

SELECT DISTINCT CATEGORY.id
FROM CATEGORY
  JOIN CATEGORY_SET 
    ON CATEGORY.id = CATEGORY_SET.parent
WHERE CATEGORY.id NOT IN (SELECT child
                          FROM CATEGORY_SET);

有人可以帮我为此编写 HQL。

【问题讨论】:

  • 我猜你的查询不会返回没有孩子的根类别
  • HQL 适用于实体、它们的字段和它们的关联。不在表格和列上。所以向我们展示你的实体。

标签: java mysql sql hibernate hql


【解决方案1】:

HQL 查询是:

select c
from Category c
where c.id not in (select child from CategorySet)  

【讨论】:

  • 我与 CategorySet 表有一对多的关联。我已经更新了关于实体的问题。
  • 所以“cc”将再次成为类别,其中不会包含子字段。所以它在那里失败了。
  • 基本上我需要“类别”,其“id”不在 CategorySet 的“子”列中。
  • 如果我没记错,内部查询应该来自 CategorySet。而且不需要加入。
  • 但是子查询总是返回空列表。
猜你喜欢
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多