java - 使用 HQL 执行搜索/用户使用哪种连接类型?

标签 java sql hibernate hql

我有以下模型;

  • 我有用户和规则
  • 一个用户可以添加到 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/

相关文章:

Java 互斥体实现

java - 以下 Java 代码在自主计算领域有何用处?

mysql - MySQL 中何时使用单引号、双引号和反引号

HibernatePersistence 类未发现 JPA + Hibernate + OSGI 的异常

java - 如何在JPA中使用Plural Attributes进行条件查询?

java - 如何在 xml 文件的命名查询中使用 Less Then 或等于 (<=)

java - 设计模式如何在使用 List 时避免 instanceOf

java - JSONObject ["name"] 不是字符串

MySQL MariaDB 不会用外键创建表

sql - 如何使用 order by x asc 对值进行排序,但如果 x 具有特定数字(例如 3)以使其显示最后一个 sql