2016-12-15 245 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

我感谢你的帮助。与此怀疑相关的任务已经移到积压,因为它不是先验的,所以我还没有能够测试它,我可能不会在一段时间。 –