上下文:
我有两个表Secret_Agent和Secret_Mission。两者都有@ManyToMany
的关系,因为可以给予许多秘密特工执行相同的秘密任务,并且可以给同一个秘密特工执行许多秘密任务。
Table SECRET_AGENT
Columns SecretAgentId, SecrentAgentName
Table SECRET_MISSION
Columns SecretMissionId, SecrentMissionName
JOIN Table
SECRET_AGENT_MISSION
Columns: SecretAgentId,SecretMissionId
Java代码:
class Secret_Agent {
.
.
.
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "SECRET_AGENT_MISSION", joinColumns = { @JoinColumn(name = "SecretAgentId") }, inverseJoinColumns = { @JoinColumn(name = "SecretMissionId") }
private List <Secret_Mission> missions;
.
.
.
}
class Secret_Mission {
.
.
.
@ManyToMany(mappedBy = "missions")
private List <Secret_Agent> agents;
.
.
.
}
问题: 我试图在下面提到的代码中获取所有没有通过Hibernate Criteria分配秘密任务的秘密代理:
Criteria criteria = session.createCriteria(Secret_Agent.class);
criteria.add(Restrictions.isNull("missions"));
但是,它不起作用。我同时试着与Projections和QBE一起运气。
另一种方法是使用Crieteria Association,但协会只适用于@OneToMany
和@ManyToOne
!
请在这里帮助我。
答案 0 :(得分:1)
我假设你的映射是正确的:使用Restrictions.isEmpty("missions") - Constrain a collection valued property to be empty
(来自javadoc)
PS:在Hibernate中,最好的方法是将映射中的init集合作为:
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "SECRET_AGENT_MISSION", joinColumns = { @JoinColumn(name = "SecretAgentId") }, inverseJoinColumns = { @JoinColumn(name = "SecretMissionId") }
private List <Secret_Mission> missions = new ArrayList<Secret_Mission>();
并对Secret_Agent.agents