我有以下模型;


我有用户,规则和团队
可以将一个用户添加到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。

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

09-12 19:06