2015-07-28 3 views
2

У меня есть запрос SQL, который производит результат, что мне нужно:Преобразование сложных SQL в HQL?

SELECT m.category_id,m.category_name, 
     e.category_name 
FROM category e 
INNER JOIN category m ON m.category_id = e.parent_category_id 
ORDER BY m.category_name 

Как я могу преобразовать это в HQL?

Категория Таблица

enter image description here

Фактический результат После выполнения запроса

enter image description here

Mapping класс

import java.io.Serializable; 
import java.util.List; 
import javax.persistence.*; 
import org.hibernate.annotations.NotFound; 
import org.hibernate.annotations.NotFoundAction; 

@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(cascade = {CascadeType.ALL}) 
    @JoinColumn(name = "parent_category_id") 
    private FetchSubCategory parent; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "parent", cascade = CascadeType.ALL) 
    private List<FetchSubCategory> subCategory; 

    public List<FetchSubCategory> getSubCategory() { 
     return subCategory; 
    } 

    public void setSubCategory(List<FetchSubCategory> subCategory) { 
     this.subCategory = 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 List<FetchSubCategory> fetchSubCategory() throws SQLException, ClassNotFoundException, IOException { 
     List<FetchSubCategory> groupList = null; 
     try { 
      Session session = sessionFactory.getCurrentSession(); 

      Query query = session.createQuery("FROM FetchSubCategory e INNER JOIN e.subCategory m ORDER BY m.parent"); 
      groupList = query.list(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return groupList; 
    } 

Ранее я задал вопрос, связанный с этим, и я не получил ответ, я застрял полностью.

+0

Из вашего запроса я могу видеть, что вы хотите только parent.id, родитель .name и child.name, но в вашей попытке HQL вы ожидаете объекты FetchSubCategory. Что вы действительно хотите? – luksch

+0

Возможный дубликат [Hibernate: self join confusion?] (Http://stackoverflow.com/questions/31668522/hibernate-self-join-confusion) – kryger

+0

У меня нет ответа на это. Вот почему я спросил с небольшим бит объяснил больше .. не делай этого, это увязло с этим. – Stella

ответ

0

Почему вы не используете конфигурации спящего режима, используя либо xml, либо аннотации.

Пример - @OneToMany

Вы можете иметь первичный ключ в таблице «Фактический результат», а затем настроить «один ко многим» отношения между двумя таблицами - с этим вы можете использовать простой HQL. Пример:

select actualResult from ActualResult actualResult. Это позволит получить данные из фактического результата и соответствующих данных из таблицы категорий.

+1

Фактический результат - это не таблица, результат я показал .. – Stella

+0

Я понял, что я ошибаюсь. –

1

HQL для вашей проблемы будет

select fsc.categoryId,fsc.categoryName,fsc.parent.categoryName from FetchSubCategory fsc 

where fsc.categoryId=fsc.parent.categoryId 

order by fsc.categoryName 

Чтобы получить более подробную информацию, как HQL работа, пожалуйста, следуйте этой статье link

+0

Это не показывает ничего как результат – user2137817

Смежные вопросы