2014-03-19 58 views
0

我有以下模型;为什么这个HQL搜索查询不起作用?

  • 我有用户和规则和团队
  • 用户可以添加到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" ,[email protected] 
     (name=RuleEntity.RULE_ID, referencedColumnName="ID", insertable = true, updatable = false, nullable = false), 
     [email protected] 
     (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,[email protected](name=TeamEntity.TEAM_ID, referencedColumnName="ID", 
     insertable = true, updatable = false, nullable = false), 
     [email protected](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,其中规则1有约翰),但相反,它是返回'约'

有谁知道如何调整上述查询,使其工作正如我所描述的(即它应该只返回一个结果,当所有3比赛)?

回答

3

好吧,这些是我的想法如下:

你有3个表:用户,规则和团队。 第一张表包含保罗和约翰。 第二个表包含rule1,rule4,rule 5.

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

第三张表包含team1,team4和团队5. 现在您将用户加入此表。 你得到了john-team1; john-team 5.(JOIN2)

现在你问的是在JOIN1(yes)和JOIN2(yes)中是否有JOIN1中的rule1和JOIN2中的john。你走了。

你需要做的是加入团队与规则。

选择UserEntity不同用户,因为用户 内部联接users.teams作为球队 内部联接user.rules作为rules1 内部联接teams.rules作为rules2
其中users.username喜欢:约翰 和rules1.ruleName像:rule1 和rules2.ruleName like:rule1 和teams.name like:team5。

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

+0

谢谢@sergiu,我是SQL/HQL的新手,这很好解释! – user2586917

0
  1. “用户可以添加到0,1个或多个规则”是一个@ManyToOne(nullable=true)@ManyToMany
  2. select distinct [someCollection]没有意义(它需要select distinct [someEntity]
+0

谢谢,虽然认为(1)是不正确的,即许多用户可以有很多规则,许多规则可以有很多用户= @ManyToMany – user2586917

+0

我会改变你的问题来反映这一点,它有点误导你如何呈现它现在。 – Gimby