【问题标题】:How to write joins in ONE to ONE relation using hibernate如何使用休眠在 ONE to ONE 关系中编写连接
【发布时间】:2018-07-09 12:31:53
【问题描述】:

我有两个课程: 1) 笔记本电脑 2)学生

@Entity
@Table(name = "LAPTOP")
public class Laptop {

    @Id
    private int lid;
    private String lname;

    public int getLid() {
        return lid;
    }
    public void setLid(int lid) {
        this.lid = lid;
    }
    public String getLname() {
        return lname;
    }
    public void setLname(String lname) {
        this.lname = lname;
    }
}



@Entity
@Table(name = "STUDENT")
public class Student {

    @Id
    private int rollno;
    private String name;
    private int marks;

    @OneToOne
    private Laptop laptop;

    public int getRollno() {
        return rollno;
    }
    public void setRollno(int rollno) {
        this.rollno = rollno;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getMarks() {
        return marks;
    }
    public void setMarks(int marks) {
        this.marks = marks;
    }
    public Laptop getLaptop() {
        return laptop;
    }
    public void setLaptop(Laptop laptop) {
        this.laptop = laptop;
    }


}

如何在这些表上使用符合条件的联接。 例如:如何使用条件编写此查询:

select STUDENT.rollno , STUDENT.name from STUDENT inner join LAPTOP on STUDENT.laptop_lid = LAPTOP.lid;

请给我解释以及编写标准的正确形式。 谢谢

【问题讨论】:

  • 如果你不对另一个表的字段做任何事情,为什么还需要join(在这个查询中)?
  • 我需要测试一下如何在hibernate中编写相同的查询
  • 您找到解决方案了吗?您还需要这方面的帮助吗?

标签: hibernate


【解决方案1】:

请注意,问题查询中不需要join,因为您不会对另一个表的字段做任何事情。假设您还想在查询中获取笔记本电脑的名称,以便 join 有意义,您只需定义一个别名:

// In DAO class:
public List<Object[]> findAllStudentsWithLaptop() {
    return DetachedCriteria.forClass(Student.class)
            .createAlias("laptop", "l")
            .setProjection(Projections.projectionList()
                    .add(Projections.property("rollno"))
                    .add(Projections.property("name"))
                    .add(Projections.property("l.lname")))
            .getExecutableCriteria(getSessionFactory().getCurrentSession()).list();
}

或者,如果您想获取具有特定笔记本电脑名称的所有学生:

// In DAO class:
public List<Object[]> findAllStudentsWithLaptop(String laptopName) {
    return DetachedCriteria.forClass(Student.class)
            .createAlias("laptop", "l")
            .add(Restrictions.eq("l.lname", laptopName))
            .setProjection(Projections.projectionList()
                    .add(Projections.property("rollno"))
                    .add(Projections.property("name")))
            .getExecutableCriteria(getSessionFactory().getCurrentSession()).list();
}

请注意(基于问题的唯一标记:hibernate)此答案涵盖了旧版 Hibernate org.hibernate.Criteria API,现在为 should be considered deprecated。

有关用于声明类型安全条件查询的 JPA API 的更多信息,请参阅Criteria。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多