2017-02-13 88 views
0

我們在我們的項目中使用hibernate。我們有一個需要左外連接的查詢。查詢如下:org.hibernate.queryexception意外的令牌與[

如何知道我在寫查詢時使用JPQL或HQL。

我有一個場景,我必須在查詢中實現左外連接。

所以我寫了''以及左外連接關鍵字。

但我得到以下異常:

org.hibernate.queryexception unexpected token with [ 

我閱讀了與HQL,但不支持JPQL。所以我有2個問題:

1)如何識別JPQL或HQL和我的項目中使用哪個版本? 2)如果'with'在JPQL中不受支持,那麼如何實現具有特定屬性值的兩個表之間的左外連接。

查詢如下:

select v.vId,v.vName,cur.code,con.dxId from 
vanTb v, regionTb r, currencyTb cur, connTb con 
where 
v.vNum = r.vNum 
and v.vCode = r.vCode 
and v.vId = cur.vId 
and v.vId *= con.vId 
and con.dlId = 1234 and v.status=1 

* = - 在Sybase>左外連接ASE數據庫。

而命名的查詢是:

select v.vId,v.vName,cur.code,con.dxId from vanTb v inner join v.regionTb r inner join 
     v.currencyTb left outer join v.connTb con with con.dlId = :DlId where vendor.status = 1 

這裏regionTb,currencyTb和connTb和vanTb是實體Bean的名稱和vanTb.java有regionTb,currencyTb和connTb爲memeber變量。

+0

ATLEAST發表您的查詢/代碼。所以我們可以告訴你如何繼續。 – Akshay

回答

0

一個很好的經驗法則是,如果您的應用程序創建了EntityManagerFactory並且您使用的是EntityManager來發出查詢,那麼您將創建基於JPQL的查詢。如果您的應用程序正在創建SessionFactory並且您使用的是Session來發出查詢,那麼您通常會提供HQL。

也就是說,每個文檔here的JPA 2.1增加了對ON條款所要求的支持。因此,爲了適用於JPQL這樣的條件,你可以這樣寫:

String sql = "SELECT e FROM Employee e LEFT JOIN e.address a ON a.city = :city" 
Query<MyEntity> query = entityManager.createQuery(sql, MyEntity.class); 
query.setParameter("city", "New York"); 
List<MyEntity> results = query.getResulList(); 

的HQL語法不支持使用WITH條款,但如下:

String sql = "SELECT e FROM Employee e LEFT JOIN e.address a WITH a.city = :city" 
Query query = session.createQuery(sql); 
query.setParameter("city", "New York"); 
List results = query.getResultList();