我有以下模型;
- 我有用户和规则
- 一个用户可以添加到 0 个、1 个或多个规则
- 一条规则可以包含 0 个、1 个或多个用户
这是 UserEntity 类:
class UserEntity {
private String username;
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;
}
...
}
以及 RuleEntity 类:
class RuleEntity {
private String name;
private List<UserEntity> users;
@Column(name = "name", nullable = false)
public String getRuleName() {
return ruleName;
}
@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;
}
...
}
我正在尝试实现一个搜索,用户可以使用以下方式进行搜索:
- 只有一个用户名
- 只有一个规则名称
- 用户名和规则名称
因此,我正在执行 2 个 HQL 查询,一个返回匹配的用户,另一个返回匹配的规则,例如
public SearchResults search(String maybePartialUsername, String maybePartialRuleName) {
List<UserEntity> userEntities = hqlQuery("select distinct users from UserEntity as users inner join users.rules as rules where users.username like :maybePartialUsername and rules.ruleName like :maybePartialRuleName");
List<RuleEntity> ruleEntities = hqlQuery("select distinct rules from RuleEntity as rules inner join rules.users as users where users.username like :maybePartialUsername and rules.ruleName like :maybePartialRuleName");
return SearchResults(userEntities, ruleEntities);
}
当用户是至少一个规则的成员时,用于查找与用户名(和/或规则名称)匹配的用户的第一个 HQL 查询工作正常,但当用户尚未添加到任何规则时,它不会返回任何结果。
将“内连接”更改为“左连接”没有帮助。问题在于“rules.ruleName like :maybePartialRuleName”条件,如果我删除此条件,则查询可以工作,但在与规则表的联接成功的情况下(即用户确实有规则),我需要在查询中使用此条件,因此我需要按规则名称和用户名进行过滤。
select distinct users from UserEntity as users inner join users.rules as rules where users.username like :maybePartialUsername and rules.ruleName like :maybePartialRuleName
最佳答案
尝试左连接
当用户离开时,从 UserEntity 中选择不同的用户加入 users.rules 作为规则,其中 users.username 类似于:maybePartialUsername,rules.ruleName 类似于:maybePartialRuleName。
它将为您提供 int 左侧的所有内容(在本例中为 userEntity)。
关于java - 使用 HQL 执行搜索/用户使用哪种连接类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22478321/