如何使用休眠方式以一对一关系编写联接

时间:2018-07-09 12:31:54

标签: hibernate

我有两节课: 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;
    }


}

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

从STUDENT内部的STUDENT.laptop_lid = LAPTOP.lid上的LAPTOP中选择STUDENT.rollno,STUDENT.name;

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

1 个答案:

答案 0 :(得分:0)

请注意,问题查询中不需要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