0

上下文:我有两个表 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,但 Association 只能与@OneToManyand一起使用@ManyToOne

请在这里帮助我。

4

1 回答 1

1

我假设您的映射是正确的:使用Restrictions.isEmpty("missions") - Constrain a collection valued property to be empty(来自 javadoc)

PS:在 Hibernate 中,在映射中初始化集合的最佳做法是:

@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

于 2013-08-08T06:05:44.370 回答