2013-04-27 45 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) 

现在我正在尝试执行内部联接,并得到类型FilesInfo的列表:

@Override 
     public List<FilesInfo> reqSharedFiles(FilesShare fs) { 
      session=HibernateUtil.getSessionFactory().getCurrentSession(); 
      session.beginTransaction(); 
      List<FilesInfo> filesInfo = null; 
      filesInfo=session.createQuery("select a.id, a.name, a.url from FilesInfo as a 
      inner join FilesShare as b on "+ 
      " a.id=b.fileId where b.userId= :userId and b.owner= :owner") 
      .setInteger("userId",fs.getUserId()).setInteger("owner",fs.getOwner()).list(); 
      session.getTransaction().commit(); 
      return filesInfo; 
     } 

和我得到这个错误

的Struts已经检测到一个未处理的异常:消息:
org.hibernate.hql。 antlr.HqlBaseParser.recover(Lantlr/RecognitionException; Lantlr/collections/impl/BitSet;)V File:org/hibernate/hql/antlr/HqlBaseParser.java行号:1,802 app.dao.UploadDAOImpl.reqSharedFiles(UploadDAOImpl.java: 79) < ------这一行指向filesInfo = session.createQuery(“选择

请请告诉我,这是错误的?

感谢

回答

2

这个问题与您正在使用休眠和ANTLR罐版本。在版本2.7.6之前,恢复方法在ANTLR Parser类中不存在?如果您使用ANTLR的早期版本,例如2.7.2,那么您将遇到问题。

SEE HERE

+0

一两件事我想知道的是,映射在实体类必须进行连接操作?我们不能加入单个表使用hql? – Aadam 2013-04-27 06:24:43

+0

你可以加入。没问题 – samba 2013-04-27 06:37:57

+0

嘿,我现在得到这个错误:\t 意外的标记:在第1行,第86列[从app.domain.FilesInfo中选择a.id,a.name,a.url作为内部加入FilesShare为b上a.id = b.fileId其中b.userId =:userId和b.owner =:所有者] – Aadam 2013-04-27 06:41:14