我正在尝试使用具有多对一关系的休眠,如下所示:
我有一个服务表,每个服务都有一个programId。
public class Service {
...
@ManyToOne
@JoinColumn(name="PROGRAM_LV_ID", referencedColumnName = "ID")
private Program program;
}
在BD中,我有以下记录:
服务表
id = 1,programid = 2
id = 2,programid = 2
id = 3,programid = 3
节目表
id = 2,名称=“ program2”
id = 3,名称=“ program3”
我正在尝试做类似的事情:
public List<Service> getServicesForProgram(long id) {
Criteria criteria = getSession().createCriteria(Service.class, "s");
criteria.createAlias("s.program", "p");
criteria.add(Restrictions.eq("p.id", id));
return (List<Service>)criteria.list();
}
当我将2传递给该方法时,我得到4条记录而不是2条记录。以某种方式重复结果,并两次获得ID为1和2的服务。
有人可以帮我解释为什么会发生重复吗?
非常感谢所有帮助。
谢谢。
最佳答案
您在普通SQL中的查询实际上是这样的:
SELECT * from service p, program where s.id = 1;
它只是将服务表中id = 1的服务和程序的记录合并在一起。
因此,如果程序表中有2条记录(主键是1和2),服务中有2条记录(外键是1),那么它要做的就是获取4行[2 x 2]。
要获取记录,可以将DISTINCT条件用作:
Criteria cr = getSession().createCriteria(Service.class);
cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);