Hibernate加入两个表并获取所有记录? [英] Hibernate joining two table and fetch all records?

查看:92
本文介绍了Hibernate加入两个表并获取所有记录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我有两个实体类Category和Events.I需要连接这两个表并获取所有符合给定条件的记录


我对此的sql查询

  SELECT * FROM c类内连接`事件`在e.category_i = c.category_id其中c.parent_category_id = 1; 

如何将此sql查询转换为hql并获取数据?我在下面尝试,但没有得到结果?对于hibernate来说,这是非常新的 p>



  import java.io.Serializable; 
import java.util.Date;
import javax.persistence。*;

/ **
*用户数据库表的持久类。
*
* /
@Entity
@Table(name =events)
public class Events实现Serializable {

private static最终的长串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;

私有整数状态;

@Column(name =created_date)
@Temporal(javax.persistence.TemporalType.DATE)
private日期createdDate;

@Column(name =last_updated_date)
@Temporal(javax.persistence.TemporalType.DATE)
private 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。*;

/ **
*用户数据库表的持久类。
*
* /
@Entity
@Table(name =category)
public class Category implements Serializable {

private static最终的长串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日期createdDate;

@Column(name =last_updated_date)
@Temporal(javax.persistence.TemporalType.DATE)
private 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;
}

}




Fetch category method




  public List< Object []> getCategoryList(int id)抛出SQLException,ClassNotFoundException,IOException {
List< Object []> groupList = null;
尝试{
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>群组列表;
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();
返回groupList;
}

使用ORM的好处之一是它可以完全完成连接查询你。



为此,您需要按照以下步骤更新您的班级模型:

  import java.io.Serializable; 
import java.util.Date;
import javax.persistence。*;

@Entity
@Table(name =events)
public class Event实现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)
私人类别类别;

@Column(name =is_trending_event)
private Integer isTrendingEvent;

@Column(name =image_url)
private String imageUrl;

私有整数状态;

@Column(name =created_date)
@Temporal(javax.persistence.TemporalType.DATE)
private日期createdDate;

@Column(name =last_updated_date)
@Temporal(javax.persistence.TemporalType.DATE)
private 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)
私人类别parentCategory;

@Column(name =created_date)
@Temporal(javax.persistence.TemporalType.DATE)
private日期createdDate;

@Column(name =last_updated_date)
@Temporal(javax.persistence.TemporalType.DATE)
private lastUpdatedDate;

@OneToMany(mappedBy =category)
private List< Event>事件;

...

}


I have two entity class Category and Events.I need to join both the tables and fetch all records which matching the given condition

My sql query for this

SELECT * FROM category c  inner join `events` e on e.category_i=c.category_id where c.parent_category_id=1;

How i can convert this sql query to hql and fetch the data ? I tried below but not getting the result ? Am very new to hibernate

Events entity class for hibernate mapping

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;
    }

}

Category entity

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;
    }

}

Fetch category method

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;
    }

解决方案

You need to think in terms of Java objects when using ORM tools.

From your question I think the query that you're trying to write will look something like:

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;
}

One of the benefits of using an ORM is that it works out the full join query for you.

For this to work you need to update your class model as follows:

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;

    ...

}

and

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;

    ...

}

这篇关于Hibernate加入两个表并获取所有记录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆