SQL语法错误
问题描述:
我想创建一个查询,以恢复所有使用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版本。
非常感谢。亲切的问候。
答
您正在以错误的方式使用连接。
The join methods return an object of type
Join<X, Y>
, whereX
is the source entity andY
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();
我感谢你的帮助。与此怀疑相关的任务已经移到积压,因为它不是先验的,所以我还没有能够测试它,我可能不会在一段时间。 –