Java Hibernate 标准多对一

Java Hibernate Criteria Many-To-One

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

我有一项服务 table,对于每项服务,我们都有一个 programId。

public class Service {
   ...
   @ManyToOne
   @JoinColumn(name="PROGRAM_LV_ID", referencedColumnName = "ID")
   private Program program;
}

在BD里,我有记录:

服务Table

id = 1, programid = 2

id = 2, programid = 2

id = 3, programid = 3

计划Table

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 的服务。

谁能帮我解释为什么会发生重复?

非常感谢所有帮助。

谢谢。

试试这个:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

你的查询 SQL 实际上是这样的:

    SELECT * from service p, program where s.id = 1;

它只是结合了来自服务和服务中 id = 1 的程序的记录 table。

因此,如果程序中有 2 条记录 table(其中主键为 1 和 2),而服务中有 2 条记录(其中外键为 1),它所做的只是获取4 行[2 x 2].

要获取记录,您可以使用 DISTINCT 条件:

   Criteria cr = getSession().createCriteria(Service.class);
   cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);