【问题标题】:Invalid query key thrown because of JPQL statement in eclipselink 2.5.2 but works in 2.3.2由于 eclipselink 2.5.2 中的 JPQL 语句引发了无效的查询键,但在 2.3.2 中有效
【发布时间】: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


【解决方案1】:

companyBean 关系上创建子查询时看起来像一个错误。一种解决方法可能是在 SIZE 函数之外指定连接,即 SELECT e FROM Emp e join e.companyBean companyBean WHERE SIZE(companyBean.emps) > 0

【讨论】:

    【解决方案2】:

    Company 没有名为 empCollection 的字段。也许您同时更改了Company 实现并忘记更新命名查询?如果您将查询更新为

    SELECT e FROM Emp e WHERE SIZE(e.company.emps) > 100
    

    应该可以。

    我还看到您在 EmpCompany 之间没有正确的关系。 mappedBy="companyBean" 没有正确指向 Emp 中的字段。

    【讨论】:

    • 对不起,我添加了来自一个项目的查询和公司实体和异常信息以及来自另一个项目的 Emp 实体,这是我的错误,我正在尝试另一个 IDE 并进行更改,这就是为什么我包括其他项目文件错误...我已经在github上上传了整个项目并提供了正确实体类的链接,在maven中,当我使用eclipselink到2.3.2时,项目运行成功,当我将其更改为eclipselink 2.5.2时发生异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多