【问题标题】:Doing inner join with Hibernate and JSP使用 Hibernate 和 JSP 进行内部连接
【发布时间】:2015-07-11 15:49:37
【问题描述】:

虽然我知道如何在 SQL 编辑器中执行此操作,但我有三个需要执行内部连接的表,但我不确定它如何与 Hibernate 一起使用。

为了充分解释,我有一个:

  • 技能(所有问题所在的位置)
  • 章节(章节标题,例如第 1 部分。第 2 部分)
  • 技能组(充当主题、运动技能、语言等)

我有单独的 DAO,每个 DAO 都有这样的代码 这是我的技能道:

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import softdev.asese.models.SkillModel;
import softdev.asese.utils.HibernateUtil;

public class SkillDao
{

    public List<SkillModel> getSkill() {
        List<SkillModel> list = new ArrayList<SkillModel>();
        Session session = HibernateUtil.openSession();
        Transaction tx = null;
        try {
            tx = session.getTransaction();
            tx.begin();
            list = session.createQuery("from SkillModel").list();
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }
        return list;
    }
}

我的段道和技能道与此相同,当然查询和命名不同。它们都是相互连接和引用的。 Skillset 与 Section 相连,而 Section 与 Skill 相连。 我也有与技能相关的评估。这将是试卷。我需要的是按照这个道正确并按顺序显示每个标题、部分和问题。到目前为止,我还没有成功,只能通过技能加载所有问题(不带分节和标题)

<% SkillDao sDao = new SkillDao();
    List<SkillModel> skList = sDao.getSkill();
%>

<tbody>
    <% for(SkillModel s : skList) { %>
        <tr>
            <td><%= s.getSkillName() %><br><br>
            <input type="radio" name="ans" value="Independent">Independent<br>
            <input type="radio" name="ans" value="Emerging">Emerging<br>
            <input type="radio" name="ans" value="No response">No Response<br><br><br></td>
        </tr>
    <% } %>

【问题讨论】:

    标签: hibernate jsp hql inner-join dao


    【解决方案1】:

    假设所有关系都是一对多的,并且您的实体对象如下所示:

    @Entity
    public class SkillSet {
        @OneToMany
        private List<Section> sections;
        public List<Section> getSections() { return sections; }
    }
    
    @Entity
    public class Section {
        @OneToMany
        private List<SkillModel> skillModels;
        @ManyToOne
        private SkillSet skillSet;
        public SkillSet getSkillSet() { return skillSet; }
    }
    
    @Entity
    public class SkillModel {
        @ManyToOne
        private Section section;
        public Section getSection() { return section; }
    }
    

    那么SkillSet和Section对象可以如下获取:

    List<SkillModel> skList = sDao.getSkill();
    for(SkillModel model : skList) {
        Section s = model.getSection();
        SkillSet ss = s.getSkillSet();
    }
    

    【讨论】:

    • Skillset和Section是一对多的意思,一个skillset可以有很多section,section to Skill也是一对多,一个section可以包含很多问题。另外,该技能只有Section的外键。 id 取决于我要显示的技能集 我的 SQL 查询是这样的: SELECT Section.section_id, Skill.skill_name FROM Skill INNER JOIN Section ON Section.section_id=Skill.section_id INNER JOIN Skillset ON Skillset.skillset_id=Section.skillset_id; WHERE Skillset.skillset_id=(WHAT SKILL SET)
    • 如果关系是一对多而不是一对一,您只需将注释替换为@OneToMany@ManyToOne。 JPA 免费为您提供内部连接,只需调用 getter 从 SkillModel 获取 Section。应该不需要执行查询。查看双向一对多关系的示例:examples.javacodegeeks.com/enterprise-java/jpa/…
    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2014-05-31
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多