我有两个实体类Category和Events。我需要连接两个表并获取与给定条件匹配的所有记录
我的SQL查询
SELECT * FROM category c inner join `events` e on e.category_i=c.category_id where c.parent_category_id=1;
我怎样才能将此SQL查询转换为hql并获取数据? 我在下面尝试了但没有得到结果?hibernate很新
用于hibernate映射的事件实体类
import java.io.Serializable; import java.util.Date; import javax.persistence.*; /** * The persistent class for the user database table. * */ @Entity @Table(name = "events") public class Events implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "event_id") private int eventId; @Column(name = "event_name") private String eventName; @Column(name = "event_description") private String eventDescription; @Column(name = "category_i") private Integer categoryI; public Integer getCategoryI() { return categoryI; } public void setCategoryI(Integer categoryI) { this.categoryI = categoryI; } @Column(name = "is_trending_event") private Integer isTrendingEvent; @Column(name = "image_url") private String imageUrl; private Integer status; @Column(name = "created_date") @Temporal(javax.persistence.TemporalType.DATE) private Date createdDate; @Column(name = "last_updated_date") @Temporal(javax.persistence.TemporalType.DATE) private Date lastUpdatedDate; public Date getCreatedDate() { return createdDate; } public void setCreatedDate(Date createdDate) { this.createdDate = createdDate; } public Date getLastUpdatedDate() { return lastUpdatedDate; } public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; } public int getEventId() { return eventId; } public void setEventId(int eventId) { this.eventId = eventId; } public String getEventName() { return eventName; } public void setEventName(String eventName) { this.eventName = eventName; } public String getEventDescription() { return eventDescription; } public void setEventDescription(String eventDescription) { this.eventDescription = eventDescription; } public Integer getIsTrendingEvent() { return isTrendingEvent; } public void setIsTrendingEvent(Integer isTrendingEvent) { this.isTrendingEvent = isTrendingEvent; } public String getImageUrl() { return imageUrl; } public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } }
类别实体
import java.io.Serializable; import java.util.Date; import javax.persistence.*; /** * The persistent class for the user database table. * */ @Entity @Table(name = "category") public class Category implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "category_id") private int categoryId; @Column(name = "category_name") private String categoryName; @Column(name = "parent_category_id") private Integer parentCategoryId; @Column(name = "created_date") @Temporal(javax.persistence.TemporalType.DATE) private Date createdDate; @Column(name = "last_updated_date") @Temporal(javax.persistence.TemporalType.DATE) private Date lastUpdatedDate; @ManyToOne @JoinTable(name="events", joinColumns = @JoinColumn(name="category_i")) private Events events; public int getCategoryId() { return categoryId; } public void setCategoryId(int categoryId) { this.categoryId = categoryId; } public String getCategoryName() { return categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } public Integer getParentCategoryId() { return parentCategoryId; } public void setParentCategoryId(Integer parentCategoryId) { this.parentCategoryId = parentCategoryId; } public Date getCreatedDate() { return createdDate; } public void setCreatedDate(Date createdDate) { this.createdDate = createdDate; } public Date getLastUpdatedDate() { return lastUpdatedDate; } public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; } }
提取类别方法
public List<Object[]> getCategoryList(int id) throws SQLException, ClassNotFoundException, IOException { List<Object[]> groupList = null; try { Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("select e from Category e inner join e.events where e.parentCategoryId=1"); //query.setParameter("id", id); groupList = query.list(); } catch (Exception e) { } return groupList; }
使用ORM工具时,您需要考虑Java对象。
根据您的问题,我认为您要编写的查询看起来像:
public List<Category> getCategoryList(int id) { List<Category> groupList; Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("select c from Category c join fetch c.events where c.parentCategory.categoryId = 1"); //query.setParameter("id", id); groupList = query.list(); return groupList; }
使用ORM的好处之一是它为您解决了完全联接查询。
为此,您需要按如下所示更新类模型:
import java.io.Serializable; import java.util.Date; import javax.persistence.*; @Entity @Table(name = "events") public class Event implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "event_id") private int eventId; @Column(name = "event_name") private String eventName; @Column(name = "event_description") private String eventDescription; @ManyToOne @JoinColumn(name = "category_i") private Category category; @Column(name = "is_trending_event") private Integer isTrendingEvent; @Column(name = "image_url") private String imageUrl; private Integer status; @Column(name = "created_date") @Temporal(javax.persistence.TemporalType.DATE) private Date createdDate; @Column(name = "last_updated_date") @Temporal(javax.persistence.TemporalType.DATE) private Date lastUpdatedDate; ... }
和
import java.io.Serializable; import java.util.Date; import javax.persistence.*; @Entity @Table(name = "category") public class Category implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "category_id") private int categoryId; @Column(name = "category_name") private String categoryName; @ManyToOne @JoinColumn(name="parent_category_id") private Category parentCategory; @Column(name = "created_date") @Temporal(javax.persistence.TemporalType.DATE) private Date createdDate; @Column(name = "last_updated_date") @Temporal(javax.persistence.TemporalType.DATE) private Date lastUpdatedDate; @OneToMany(mappedBy="category") private List<Event> events; ... }