2013-04-27 72 views
1

您好以下實體;hql內部連接預計加入的路徑!錯誤

@Entity 
public class FilesInfo { 
    @Id 
    @GeneratedValue 
    private Integer id; 
    private String name; 
    private String url; 

    @OneToMany(cascade= CascadeType.ALL) 
    @JoinColumn(name="fileId") 
    private Collection<FilesShare> filesShared = new ArrayList<FilesShare>(); 

    public Collection<FilesShare> getFilesShared() { 
     return filesShared; 
    } 

    public void setFilesShared(Collection<FilesShare> filesShared) { 
     this.filesShared = filesShared; 
    } 
//getters & setters 
} 

另一個

@Entity 
public class FilesShare { 
    private Integer id; 
    private int userId; 
    private int owner; 
} 

的resultand表是:

mysql> desc filesshare; 
+--------+---------+------+-----+---------+----------------+ 
| Field | Type | Null | Key | Default | Extra   | 
+--------+---------+------+-----+---------+----------------+ 
| id  | int(11) | NO | PRI | NULL | auto_increment | 
| userId | int(11) | NO |  | NULL |    | 
| owner | int(11) | NO |  | NULL |    | 
| fileId | int(11) | YES | MUL | NULL |    | 
+--------+---------+------+-----+---------+----------------+ 
4 rows in set (0.01 sec) 

mysql> desc filesinfo; 
+-------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+-------+--------------+------+-----+---------+----------------+ 
| id | int(11)  | NO | PRI | NULL | auto_increment | 
| name | varchar(255) | YES |  | NULL |    | 
| url | varchar(255) | YES |  | NULL |    | 
+-------+--------------+------+-----+---------+----------------+ 
3 rows in set (0.00 sec) 

我想使HQL爲我做了下面的SQL:

select a.id, a.name, a.url from FilesInfo a inner join FilesShare b 
on a.id=b.fileid where b.userid=5 and b.owner=1; 

那給出以下輸出:

mysql> select a.id, a.name, a.url from FilesInfo a inner join FilesShare b on a. 
id=b.fileid where b.userid=5 and b.owner=1; 
+----+-------------------+-------------------------------------+ 
| id | name    | url         | 
+----+-------------------+-------------------------------------+ 
| 1 | dwnld_btn_1.png | C:\shareapp\admin\dwnld_btn_1.png | 
| 2 | dwnld_btn_1.png | C:\shareapp\admin\dwnld_btn_1.png | 
| 3 | dwnld_btn_1.png | C:\shareapp\admin\dwnld_btn_1.png | 
| 4 | dwnld_btn_1_1.png | C:\shareapp\admin\dwnld_btn_1_1.png | 
+----+-------------------+-------------------------------------+ 

我嘗試以下HQL:

select a.id, a.name, a.url from FilesInfo a inner join FilesShare b 
where a.id=b.fileid and b.userid=5 and b.owner=1 

,但我得到這個錯誤

路徑預期的加入! [select a.id,a.name,a.url from app.domain.FilesInfo a join join FilesShare b where a.id = b.fileid and b.userid = 5 and b.owner = 1]

怎麼辦內現在加入,是個問題

三江源

+0

fileid是來自filesinfo表的id列,它是一個外鍵。我認爲它明確從entityclasses我的意思是以上給出 – Aadam 2013-04-27 08:11:06

回答

2

查詢需要的路徑,你可以參考這個問題的詳細信息:HQL ERROR: Path expected for join

所以,這樣的事情應該可以解決它:

select a.id, a.name, a.url from FilesInfo a inner join a.filesShared b where b.userid=5 and b.owner=1; 

但我只想在你FilesShare一個多對一映射:

private FilesInfo filesInfo; 

@ManyToOne 
@JoinColumn(name = "id") 
public FilesInfo getFilesInfo() { 
    return filesInfo; 
} 

public void setFilesInfo(FilesInfo filesInfo) { 
    this.filesInfo = filesInfo; 
} 

,併爲此查詢

from FilesShare where userId = 5 and owner = 1 

看起來更好nd返回文件共享列表,其中每個文件共享父項(filesInfo)字段已填充。

+0

你能寫請求我完全查詢困惑。請儘量使用內部連接 – Aadam 2013-04-27 08:16:20

+0

已更新的答案與我看來唯一的方法來做你想要的 – 2013-04-27 10:13:19

+0

這個hql有什麼問題?從FilesInfo中選擇a.id,a.name,a.url一個內部連接FilesShare b 其中a.id = b.fileid和b.userid = 5和b.owner = 1 – Aadam 2013-04-27 15:22:10

0

更新的彈簧數據版本爲1.10.4.RELEASE,並解決了這個問題。