title: JAVA : HOW TO Join same table in hibernate and select column's value
body: <p>I have a category table. </p>
  
  <p>createTable.sql</p>
  
  <pre><code>CREATE TABLE IF NOT EXISTS `product_category` (
    `category_id` int(11) NOT NULL AUTO_INCREMENT,
    `category_name` varchar(10) NOT NULL,
    `parent_category_id` int(11) DEFAULT NULL,
    `created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `created_by` int(11) NOT NULL,
    PRIMARY KEY (`category_id`),
    KEY `created_by` (`created_by`),
    KEY `parent_category_id` (`parent_category_id`)
  ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 
  </code></pre>
  
  <p>ProductCategory.java</p>
  
  <pre><code>import java.sql.Timestamp;
  import java.util.HashSet;
  import java.util.Set;
  
  import javax.persistence.CascadeType;
  import javax.persistence.Column;
  import javax.persistence.Entity;
  import javax.persistence.Id;
  import javax.persistence.JoinColumn;
  import javax.persistence.ManyToOne;
  import javax.persistence.OneToMany;
  import javax.persistence.Table;
  
  import org.hibernate.annotations.Cascade;
  
  import javax.persistence.GeneratedValue;
  import static javax.persistence.GenerationType.IDENTITY;
  @Entity
  @Table(name="product_category")
  public class ProductCategory {
  private int categoryId;
  private String categoryName;
  private Integer parentCategoryId;
  private Timestamp createdOn;
  private int createdBy;
  @Id @GeneratedValue(strategy=IDENTITY)
  
  
  @Column(name="category_id", unique=true, nullable=false)
  public int getCategoryId() {
      return categoryId;
  }
  public void setCategoryId(int categoryId) {
      this.categoryId = categoryId;
  }
  
     @Column(name="category_name", nullable=false, length=100)
  public String getCategoryName() {
      return categoryName;
  }
  public void setCategoryName(String categoryName) {
      this.categoryName = categoryName;
  }
  @Column(name="parent_category_id")
  public Integer getParentCategoryId() {
      return parentCategoryId;
  }
  public void setParentCategoryId(Integer parentCategoryId) {
      this.parentCategoryId = parentCategoryId;
  }
  @Column(name="created_on")
  public Timestamp getCreatedOn() {
      return createdOn;
  }
  public void setCreatedOn(Timestamp createdOn) {
      this.createdOn = createdOn;
  }
  @Column(name="created_by")
  public int getCreatedBy() {
      return createdBy;
  }
  public void setCreatedBy(int createdBy) {
      this.createdBy = createdBy;
  }
  public ProductCategory(String categoryName) {
  
      this.categoryName = categoryName;
  }
  
  
  public ProductCategory() {
  
  
  }    
  
  @ManyToOne(cascade=CascadeType.ALL)
  @JoinColumn(name="parent_category_id")
  private ProductCategory subcategory;
  
  @OneToMany(mappedBy="subcategory")
  private Set&lt;ProductCategory&gt; subordinates=new HashSet&lt;ProductCategory&gt;();
  }
  </code></pre>