【发布时间】:2014-04-25 15:06:33
【问题描述】:
我有以下型号;
- 我有用户、规则和团队
- 可以将用户添加到 0、1 或多个规则中
- 可以将用户添加到 0 个、1 个或多个团队中
- 一个规则只能添加到一个团队,但一个团队可以包含许多不同的规则
- 一条规则可以包含 0、1 或更多用户
这是 UserEntity 类:
class UserEntity {
private String username;
private List<TeamEntity> teams;
private List<RuleEntity> rules;
@Column(name = "username", nullable = false, unique = true)
public String getUsername() {
return username;
}
@ManyToMany(mappedBy="users" , fetch = FetchType.LAZY)
public List<RuleEntity> getRules() {
return rules;
}
@ManyToMany(mappedBy="users" , fetch = FetchType.LAZY)
public List<TeamEntity> getTeams() {
return teams;
}
...
}
还有 RuleEntity 类:
class RuleEntity {
private String name;
private List<UserEntity> users;
private TeamEntity ownerTeam;
@Column(name = "name", nullable = false)
public String getRuleName() {
return ruleName;
}
@ManyToOne
@JoinColumn(name=TeamEntity.TEAM_ID, nullable = false)
public TeamEntity getOwnerTeam() {
return ownerTeam;
}
@ManyToMany (fetch = FetchType.LAZY)
@JoinTable(name= "RULE_USER" ,joinColumns=@JoinColumn
(name=RuleEntity.RULE_ID, referencedColumnName="ID", insertable = true, updatable = false, nullable = false),
inverseJoinColumns=@JoinColumn
(name=UserEntity.USER_ID, referencedColumnName="ID", insertable = true, updatable = false, nullable = false),
uniqueConstraints = @UniqueConstraint(columnNames = {RuleEntity.RULE_ID, UserEntity.USER_ID}))
public List<UserEntity> getUsers() {
return users;
}
...
}
还有 TeamEntity 类:
class TeamEntity {
private String name
private List<UserEntity> users;
private List<RuleEntity> rules;
@ManyToMany (fetch = FetchType.LAZY)
@JoinTable(name= TeamEntity.TEAM_USER_TABLE,joinColumns=@JoinColumn(name=TeamEntity.TEAM_ID, referencedColumnName="ID",
insertable = true, updatable = false, nullable = false),
inverseJoinColumns=@JoinColumn(name=TeamEntity.USER_ID, referencedColumnName="ID",
insertable = true, updatable = false, nullable = false),
uniqueConstraints = @UniqueConstraint(columnNames = {TeamEntity.TEAM_ID, TeamEntity.USER_ID}))
public List<UserEntity> getUsers() {
return users;
}
@OneToMany (mappedBy = "ownerTeam", cascade = {CascadeType.ALL}, orphanRemoval=true)
public List<RuleEntity> getRules() {
return rules;
}
...
}
所以,假设我创建了以下模型:
/**
* <pre>
* Team ("team1")
* |
* Rule ("rule1")
* | |
* User ("john")
* </pre>
*/
/**
* <pre>
* Team ("team4")
* |
* Team ("team5")
* | |
* Rule ("rule4") Rule ("rule5")
* | |
* User ("paul") User("john")
* </pre>
*/
我正在尝试实现一个搜索,用户可以使用用户名、团队名称和规则名称进行搜索,即 3 必须匹配才能返回任何结果。我目前有以下返回匹配 3 个搜索词的用户:
select distinct users from UserEntity as users inner join users.rules as rules inner join users.teams as teams where users.username like :john and rules.ruleName like :rule1 and teams.name like :team5
所以使用上面的 HQL 查询,我希望结果不会返回任何用户实体(因为其中没有包含 rule1 的 team5,而 rule1 中有 john),而是返回“John”
有谁知道如何调整上面的查询,使其像我描述的那样工作(即它应该只在所有 3 个匹配时才返回结果)?
【问题讨论】:
标签: java sql hibernate join hql