2013-04-27 71 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,并解决了这个问题。