【问题标题】:Why is this HQL search query not working?为什么此 HQL 搜索查询不起作用?
【发布时间】: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


    【解决方案1】:
    1. “一个用户可以添加到 0、1 或多个规则”是 @ManyToOne(nullable=true) NOT @ManyToMany
    2. select distinct [someCollection] 没有意义(必须是select distinct [someEntity])

    【讨论】:

    • 谢谢,虽然认为(1)是不正确的,即很多用户可以有很多规则,很多规则可以有很多用户=@ManyToMany
    • 我会更改您的问题以准确反映这一点,这有点误导您现在如何呈现它。
    【解决方案2】:

    好的,这些是我对此的看法:

    您有 3 个表:用户、规则和团队。 第一个表包含 Paul 和 john。 第二个表包含规则1、规则4、规则5。

    这些表的连接返回 john - rule1;约翰 - 规则 5; (JOIN1)

    第三个表包含 team1、team4 和 team 5。 现在您使用此表加入用户。 你得到 john-team1;约翰团队 5.(JOIN2)

    现在您要问的是,USERS 中是否有一个 john(是),规则 1 在 JOIN1(是)中,team5 在 JOIN2(是)中。给你。

    您需要做的是按照规则加入团队。

    从 UserEntity 中选择不同的用户作为用户 内部加入 users.teams 作为团队 内连接 user.rules 作为 rules1 内部加入 team.rules 作为 rules2
    其中 users.username 喜欢 :john 和 rules1.ruleName 像 :rule1 和 rules2.ruleName 像 :rule1 和 team.name 像 :team5。

    但是在用户和团队中都有规则是很奇怪的。我会重新考虑这个。

    【讨论】:

    • 感谢 @sergiu,我是 SQL/HQL 的新手,对此进行了很好的解释!
    猜你喜欢
    • 2012-03-26
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    相关资源
    最近更新 更多