2016-06-14 80 views
0

在執行下面的代碼路徑,我得到這個例外HQL左連接 - org.hibernate.hql.internal.ast.ErrorCounter - 預期加入

ERROR org.hibernate.hql.internal.ast。 ErrorCounter - 預計路徑 加入!

實體類DB觀點:對數據庫表

@NamedQueries({ 
@NamedQuery(name = "find", 
      query = "SELECT v.cxxx, trk.cxxx, trk.ixxx" 
     + "FROM AxxxCxxx as v LEFT JOIN AxxxCxxxTxxx as trk " 
     + "ON v.cxxx = trk.cxxx " 
     ) 
}) 

@Entity 
@Table(name = "V_XXX") 
public class AxxxCxxx implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@Column(name = "CXXX") 
private String cxxx; 
//getter, setter 
} 

ENTITY1類:

@Entity 
@Table(name = "T_XXX") 
public class AxxxCxxxTxxx extends Super implements 
    Serializable { 

private static final long serialVersionUID = 1L; 

@Column(name = "CXXX") 
private String cxxx; 
//getter, setter 
} 

超類:

@MappedSuperclass 
public abstract class Super implements Serializable { 
private static final long serialVersionUID = -1413197336548058176L; 

@Id 
@Column(name = "TXXX", nullable = false) 
private Integer txxx; 

@Column(name = "IXXX", length = 15) 
private String ixxx; 
//getter, setter 

} 

當我嘗試執行NamedQuery,我得到這個例外:

Caused by: org.hibernate.HibernateException: Errors in named queries: find 
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:504) 
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:802) 
... 26 more 

org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [SELECT v.cxxx, trk.cxxx, trk.ixxx" 
    + "FROM AxxxCxxx as v LEFT JOIN AxxxCxxxTxxx as trk " 
    + "ON v.cxxx = trk.cxxx] 
org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'trk.ixxx' 
at org.hibernate.hql.internal.ast.util.LiteralProcessor.lookupConstant(LiteralProcessor.java:114) ~[hibernate-core-5.0.5.Final.jar:5.0.5.Final] 

請問,有人可以幫助我嗎?我怎樣才能解決視圖和表使用JPQL MappedSuperClass的左連接?

回答

0

您將不得不使用@NamedNativeQuery進行SQL查詢。使用@NamedQuery查詢表達式是HQL。

考慮到上述映射,你真的不能HQL加入,你可以只使用笛卡爾積

@NamedQuery(name = "find", 
     query = "select v.cxxx, trk.cxxx, trk.ixxx " 
    + "from AxxxCxxx as v, AxxxCxxxTxxx as trk " 
    + "where v.cxxx = trk.cxxx " 
    ) 

})

0

你需要,如果你想給實體之間的映射關係在JPQL查詢中使用JOIN。

喜歡的東西

FROM AxxxCxxx as v INNER JOIN v.axxxCxxxTxxx as trk. 

其中axxxCxxxTxxx是取決於DB結構AxxxCxxx類中聲明和正確映射的字段。

可以獲得附加信息herehere