2016-12-15 635 views
0

我想創建一個查詢,以恢復所有使用JPA標準查詢與用戶相關的站點(OpenJPA的錯誤?):SQL語法錯誤

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Site> query = cb.createQuery(Site.class); 
Root<Site> fromSite = query.from(Site.class); 
Join<UserSiteClientRolePK, Integer> joinUser = fromSite 
    .join(Site_.siteClients) 
    .join(SiteClient_.usersSitesClientsRoles) 
    .join(UserSiteClientRole_.id) 
    .join(UserSiteClientRolePK_.userid); 
query = query.select(fromSite); 
query = query.where(cb.equal(joinUser, userid)); 
TypedQuery<Site> typedQuery = em.createQuery(query); 
List<Site> sites = typedQuery.getResultList(); 

然而,當我測試代碼我得到這個錯誤:

<openjpa-2.4.0-r422266:1674604 fatal general error> 
org.apache.openjpa.persistence.PersistenceException: 
ERROR: error de sintaxis en o cerca de «AND» 

Position: 440 {prepstmnt 737085888 
SELECT ... 
WHERE (t3.userid = ? AND AND) [params=?]} [code=0, state=42601] 

出於某種原因,OpenJPA的是包括錯誤的SQL代碼「和AND)」在自動生成的SQL腳本的結尾,我想不通爲什麼。

這使我瘋狂。請有人幫助我嗎?順便說一下,我使用的是OpenJPA 2.4.0版本。

非常感謝。親切的問候。

回答

0

您正在以錯誤的方式使用連接。

The join methods return an object of type Join<X, Y> , where X is the source entity and Y is the target of the join.

請檢查此鏈接:

http://docs.oracle.com/javaee/6/tutorial/doc/gjivm.html#gjiuv

嘗試此查詢:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Site> query = cb.createQuery(Site.class); 
Root<Site> fromSite = query.from(Site.class); 

Join<Site, SiteClient> siteClient = fromSite 
    .join(Site_.siteClients); 

Join<siteClient, UserSiteClientRole_> userSiteClientRole = siteClient 
    .join(SiteClient_.usersSitesClientsRoles); 

query = query.select(fromSite); 
query = query.where(cb.equal(userSiteClientRole.get(UserSiteClientRole_.userid), userid)); 
TypedQuery<Site> typedQuery = em.createQuery(query); 
List<Site> sites = typedQuery.getResultList(); 
+0

我感謝你的幫助。與此懷疑相關的任務已經移到積壓,因爲它不是先驗的,所以我還沒有能夠測試它,我可能不會在一段時間。 –