복붙노트

[SPRING] 최대 절전 모드 두 테이블을 조인하고 모든 레코드를 가져 옵니까?

SPRING

최대 절전 모드 두 테이블을 조인하고 모든 레코드를 가져 옵니까?

이것에 대한 내 SQL 쿼리

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

이 SQL 쿼리를 hql로 변환하고 데이터를 가져올 수 있습니까? 아래에서 시도했지만 결과를 얻지 못했습니까? 최대 절전 모드에 매우 익숙하다.

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

해결법

  1. ==============================

    1.ORM 도구를 사용할 때는 Java 객체를 고려해야합니다.

    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;
    
        ...
    
    }
    
  2. ==============================

    2.Hibernate는 객체와 관계를 매핑하는 것에 관한 것이지만, 간단한 id 필드를 매핑한다.

    Hibernate는 객체와 관계를 매핑하는 것에 관한 것이지만, 간단한 id 필드를 매핑한다.

    Events 클래스에는 다음 항목이 있습니다.

    @Entity
    @Table(name = "events")
    public class Events implements Serializable { 
    
        @Column(name = "category_i")
        private Integer categoryI;
    
    }
    

    그러나 정수 대신 범주 여야합니다.

    @Entity
    @Table(name = "events")
    public class Events implements Serializable { 
    
        @ManyToOne
        @Column(name = "category_i")
        private Category category;
    
    }
    

    그런 다음 범주에서 mappedBy 필드를 @ManyToOne 이벤트 필드에 추가하고 @JoinColumn을 제거해야합니다.

    @Entity
    @Table(name = "category")
    public class Category implements Serializable {
    
        @OneToMany(mappedBy="category")
        private Events events;
    }
    

    Category 클래스의 parentCategoryId에도 동일하게 적용됩니다.

    이제 매핑을 수정 했으므로 원하는대로 쿼리를 작성할 수 있습니다.

  3. ==============================

    3.이 쿼리는 작업을 수행해야합니다.

    이 쿼리는 작업을 수행해야합니다.

    from Category as c
    inner join c.events as e
    where c.parentCategoryId = 1
    

    게다가 여기에 오타가 있습니다 (끝에 "d"가 누락 된 것 같습니다).

    @JoinColumn (name = "category_i"))

  4. ==============================

    4.이 코드 아래의 Ty

    이 코드 아래의 Ty

    public List<Object[]> getCategoryList(int id) throws SQLException, ClassNotFoundException, IOException {
    
    
            Session session = sessionFactory.getCurrentSession();
            return session.createCriteria(Catagory.class)
            .setFetchMode("events", FetchMode.JOIN)
            .add(Restrictions.eq("parentCatagoryId", 1))
            .list();
    
    }
    

    희망이 물건을 작동합니다.

  5. from https://stackoverflow.com/questions/31509568/hibernate-joining-two-table-and-fetch-all-records by cc-by-sa and MIT license