我试图将hibernate与多对一关系一起使用,如下所示:
我有一个服务表,每个服务都有一个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,name =" program2"
id = 3,name =" 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两次。
有人可以帮我解释复制的原因吗?
非常感谢所有帮助。
感谢。
答案 0 :(得分:1)
试试这个:
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
答案 1 :(得分:0)
您在普通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);