我正在尝试使用具有多对一关系的休眠,如下所示:

我有一个服务表,每个服务都有一个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);

07-24 16:04