我有以下模型;
我有用户,规则和团队
可以将一个用户添加到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个匹配的情况下才应返回结果)?
最佳答案
好的,这些是我对此的想法:
您有3个表:用户,规则和团队。
第一个表包含保罗和约翰。
第二个表包含rule1,rule4,rule 5。
这些表的联接返回john-rule1;约翰-Rule5; (JOIN1)
第三张表包含team1,team4和team 5。
现在,您将用户与该表一起使用。
您得到john-team1;约翰队5.(JOIN2)
现在您要问的是,USERS中是否有john(是),JOIN1中是rule1(是),而JOIN2中是team5(是)。你去。
您需要做的就是按照规则加入团队。
从UserEntity中选择不同的用户作为用户
内部加入users.teams作为团队
内部联接user.rules作为rules1
内部加入teams.rules作为rules2
其中users.username像:john
和rules1.ruleName,如:rule1
和rules2.ruleName,如:rule1
和teams.name一样:team5。
但是在用户和团队中都有规则是很奇怪的。我会重新考虑。