Java Hibernate Criteria Many-To-One

时间:2015-07-22 14:31:06

标签: java hibernate hibernate-criteria

我试图将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两次。

有人可以帮我解释复制的原因吗?

非常感谢所有帮助。

感谢。

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);