I have a
category
table.In which first 5 are main category and others are sub category.
I need to fetch the sub categories of first 5 main category so i have found the sql query
SELECT m.category_id,m.category_name AS 'Parent', e.category_name AS 'Sub' FROM category e INNER JOIN category m ON m.category_id = e.parent_category_id ORDER BY Parent
The query is joining the same table itself.and am getting the result given below
Result
How can i convert the SQL query to HQL and return the data like above image to user in standard json format ?
FetchSubCategory
import java.io.Serializable; import java.util.Set; import javax.persistence.*; @Entity @Table(name = "category") public class FetchSubCategory implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "category_id") private Integer categoryId; @Column(name = "category_name") private String categoryName; @ManyToOne(cascade = {CascadeType.ALL}) @JoinColumn(name = "parent_category_id") private FetchSubCategory parent; @OneToMany(mappedBy = "parent") private Set<FetchSubCategory> subCategory; public Integer getCategoryId() { return categoryId; } public void setCategoryId(Integer categoryId) { this.categoryId = categoryId; } public String getCategoryName() { return categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } public FetchSubCategory getParent() { return parent; } public void setParent(FetchSubCategory parent) { this.parent = parent; } public Set<FetchSubCategory> getSubCategory() { return subCategory; } public void setSubCategory(Set<FetchSubCategory> subCategory) { this.subCategory = subCategory; } }
Method
public Set<FetchSubCategory> fetchSubCategory() throws SQLException, ClassNotFoundException, IOException { Set<FetchSubCategory> groupList = null; try { Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("SELECT m.categoryName AS 'Parent', e.categoryName AS 'Sub' FROM FetchSubCategory e INNER JOIN FetchSubCategory m ORDER BY Parent"); groupList = (Set<FetchSubCategory>) query.list(); } catch (Exception e) { e.printStackTrace(); } return groupList; }
Can any one please correct my mistake and tell me how to fetch result like above image?
Advertisement
Answer
This stuff will solve your problem
@Entity @Table(name = "category") public class FetchSubCategory implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "category_id") private Integer categoryId; @Column(name = "category_name") private String categoryName; @NotFound(action = NotFoundAction.IGNORE) @ManyToOne @JsonIgnore @JoinColumn(name = "parent_category_id") private FetchSubCategory mainCategory; @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)//Avoiding empty json arrays.objects @OneToMany(mappedBy = "mainCategory", fetch = FetchType.EAGER) private List<FetchSubCategory> subCategory; public Integer getCategoryId() { return categoryId; } public void setCategoryId(Integer categoryId) { this.categoryId = categoryId; } public String getCategoryName() { return categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } public FetchSubCategory getMainCategory() { return mainCategory; } public void setMainCategory(FetchSubCategory mainCategory) { this.mainCategory = mainCategory; } public List<FetchSubCategory> getSubCategory() { return subCategory; } public void setSubCategory(List<FetchSubCategory> subCategory) { this.subCategory = subCategory; }
Get your sub categories
public List<FetchSubCategory> fetchSubCategory() throws SQLException, ClassNotFoundException, IOException { List<FetchSubCategory> groupList = null; try { Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("select distinct e FROM FetchSubCategory e INNER JOIN e.subCategory m ORDER BY m.mainCategory"); groupList = query.list(); } catch (Exception e) { e.printStackTrace(); } return groupList; }