2014-03-19 57 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