Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Specifying join condition "ON columns" in hibernate HQL?

Tags:

java

hibernate

I am learning Hibernate, and I have a question about basic HQL join syntax. I am following this tutorial. Say I have a Product and Category entity,

@Entity
@Table(name = "CATEGORY")
public class Category {

    private long id;
    private String name;

    private Set<Product> products;

    public Category() {
    }

    public Category(String name) {
        this.name = name;
    }

    @Id
    @Column(name = "CATEGORY_ID")
    @GeneratedValue
    public long getId() {
        return id;
    }


    @OneToMany(mappedBy = "category", cascade = CascadeType.ALL)
    public Set<Product> getProducts() {
        return products;
    }

    // other getters and setters
}

@Entity
@Table(name = "PRODUCT")
public class Product {
    private long id;
    private String name;
    private String description;
    private float price;

    private Category category;

    public Product() {
    }

    public Product(String name, String description, float price,
            Category category) {
        this.name = name;
        this.description = description;
        this.price = price;
        this.category = category;
    }

    @Id
    @Column(name = "PRODUCT_ID")
    @GeneratedValue
    public long getId() {
        return id;
    }

    @ManyToOne
    @JoinColumn(name = "CATEGORY_ID")
    public Category getCategory() {
        return category;
    }

    // other getters and setters
}

So I have to join category and Product, I will something like this in sql

select * from Category A inner join Product B on A.id=B.category_id,

In HQL, it seems we drop the "on" condition, the HQL for the above query is

String hql = "from Product p inner join p.category";

Query query = session.createQuery(hql);

Why is on not required in HQL?

like image 349
Dude Avatar asked Oct 23 '25 15:10

Dude


1 Answers

If you have an association (for an example @ManyToOne), you don't need on, Hibernate will add it to the SQL.

It was a problem prior to Hibernate 5.1, If you don't have an association. From Hibernate 5.1 you can use ad hoc joins:

How to join unrelated entities with JPA and Hibernate

Apart that, HQL also defines a with clause to qualify the join conditions:

Hibernate docs: Explicit joins

like image 132
v.ladynev Avatar answered Oct 26 '25 05:10

v.ladynev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!