[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.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.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.이 쿼리는 작업을 수행해야합니다.
이 쿼리는 작업을 수행해야합니다.
from Category as c inner join c.events as e where c.parentCategoryId = 1
게다가 여기에 오타가 있습니다 (끝에 "d"가 누락 된 것 같습니다).
@JoinColumn (name = "category_i"))
-
==============================
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(); }
희망이 물건을 작동합니다.
from https://stackoverflow.com/questions/31509568/hibernate-joining-two-table-and-fetch-all-records by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring DispatcherServlet : HTTP 요청에 대한 매핑이 없습니다. (0) | 2019.03.30 |
---|---|
[SPRING] 스프링의 동적 폼 (0) | 2019.03.30 |
[SPRING] Spring의 명령 객체 (0) | 2019.03.30 |
[SPRING] URI 구문 분석을위한 Spring 유틸리티 (0) | 2019.03.30 |
[SPRING] 봄 애플리케이션에서 사용자 권한 부여 후 사용자 정의 필터를 추가하는 방법 (0) | 2019.03.30 |