【发布时间】:2014-07-18 00:08:21
【问题描述】:
我有以下 JQPL 查询:
SELECT e FROM Emp e WHERE SIZE(e.companyBean.emps) > 0
问题是它在eclipselink 2.5.2上不起作用,当我在2.3.2上尝试时它成功了
我认为 JPA 中可能存在一些不允许此路径导航但在网络上找不到任何内容的更改。
那么这个查询有什么问题或者 eclipselink 的变化可能是这个异常的原因吗??
谢谢
整个maven项目:https://github.com/mohamedkomalo/jpa2-eclipselink/
Emp 实体:https://github.com/mohamedkomalo/jpa2-eclipselink/blob/master/src/main/java/model/Emp.java
公司实体:https://github.com/mohamedkomalo/jpa2-eclipselink/blob/master/src/main/java/model/Company.java
例外
Exception in thread "main" Local Exception Stack:
Exception [EclipseLink-6015] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.QueryException
Exception Description: Invalid query key [
Query Key emps
Base model.Emp{DatabaseTable(t0)=DatabaseTable(emp)}] in expression.
Query: ReadAllQuery(name="Emp.findEmployeesInBigCompanies" referenceClass=Emp jpql="SELECT e FROM Emp e WHERE SIZE(e.companyBean.emps) > 0")
at org.eclipse.persistence.exceptions.QueryException.invalidQueryKeyInExpression(QueryException.java:697)
at org.eclipse.persistence.internal.expressions.ObjectExpression.getDescriptor(ObjectExpression.java:453)
at org.eclipse.persistence.internal.expressions.SubSelectExpression.normalizeSubSelect(SubSelectExpression.java:186)
at org.eclipse.persistence.internal.expressions.ExpressionNormalizer.normalizeSubSelects(ExpressionNormalizer.java:114)
at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalize(SQLSelectStatement.java:1534)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.buildNormalSelectStatement(ExpressionQueryMechanism.java:549)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareSelectAllRows(ExpressionQueryMechanism.java:1720)
at org.eclipse.persistence.queries.ReadAllQuery.prepareSelectAllRows(ReadAllQuery.java:813)
at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:744)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:661)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:901)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:613)
at org.eclipse.persistence.internal.jpa.QueryImpl.getDatabaseQueryInternal(QueryImpl.java:341)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1124)
at practicies.Day2.runPractice3(Day2.java:58)
at practicies.Day2.main(Day2.java:22)
【问题讨论】:
-
我正在使用 EclipseLink 2.5.0 测试
SIZE,它的工作原理就像一个魅力。您介意发布Company实体定义以及与empCollection的关系吗? -
@zbigniewTomczak 一点也不,我已经发布了公司实体...我可以上传整个项目,因为它是我尝试 JPA 的实践项目
-
在创建关于 companyBean 关系的子查询时看起来像一个错误,但我不知道为什么它会在 2.5 中损坏。如果在 size 函数之外指定连接会发生什么?即:“SELECT e FROM Emp e join e.companyBean companyBean WHERE SIZE(companyBean.emps) > 0”
-
@Chris 您可以将您的评论作为答案发布,以便我将其标记为已接受的答案吗?
标签: java jpa eclipselink jpql