我有两节课: 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;
请给我解释以及编写标准的正确形式。 谢谢
答案 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。