我有一个没有主键的映射表。它只有2列,如student_id和test_id 每个学生都有多个考试
student_id test_id
1001 21
1001 52
1001 35
1001 29
1001 12
当我写了查询
select test_id from test_map where student_id =1001
它获取正确的记录但是当我通过休眠标准时它显示5个值,test_id只有21
在我的pojo中 我尝试使用student_id作为@ID,并且在该pojo中没有@ID
Criteria criteria = session.createCriteria(StudentTestMapping.class);
criteria.add(Restrictions.eq("studentId", studentId));
List<StudentTestMapping> screenList=criteria.list();
Iterator<StudentTestMapping> testItr = screenList.iterator();
while (testItr.hasNext()) {
StudentTestMapping studentTestMap = (StudentTestMapping) testItr.next();
Long testId = studentTestMap.getTestId();
System.out.println("testId : " + testId);
}
StudentTestMapping.java
@Entity
@Table(name = "test_map")
class StudentTestMapping{
Long studentId;
Long testId;
@ID
@Column(name = "student_id")
public Integer getStudentId()
{
return this.studentId;
}
public void setStudentId(Integer studentId)
{
this.studentId = studentId;
}
@Column(name = "test_id")
public String getTestId()
{
return this.testId;
}
public void setTestId(String testId)
{
this.testId = testId;
}
}
答案 0 :(得分:0)
1)确保你的pojo实现了Serializable。
2)您可以将studentId注释为NaturalId。
@NaturalId
@Column(name = "student_id")
public Integer getStudentId()
{
return this.studentId;
}
您可以通过以下方式访问它:
session.bySimpleNaturalId(StudentTestMapping.class)
.load(studentId)
3)您的实体必须拥有身份证明。您可以添加自动递增标识列,或者如上所述,您可以创建包含所有列的复合键。 Basic O/R Mapping