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);
我正在尝试使用具有多对一关系的休眠,如下所示:
我有一项服务 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);