【问题标题】:JPQL NOT EXISTS in ObjectDBJPQL 在 ObjectDB 中不存在
【发布时间】:2013-04-16 19:24:06
【问题描述】:

我正在尝试将我的 Spring 项目从 Hibernate 迁移到 ObjectDB。在 ObjectDB 页面上,他们说 ObjectDB 与 JPA 100% 兼容。但是,我对这个 JPQL 查询有疑问:

SELECT e FROM Employee e WHERE e.present = false AND NOT EXISTS 
(SELECT c FROM Computer c WHERE c.employeeEntity = e) 
ORDER BY e.name

使用 Hibernate,这个查询没有问题,但是 ObjectDB 抛出异常:

com.objectdb.o.UserException: Unexpected query token 'EXISTS'

第二个问题是标准语言。这段代码:

In<Employee> inExpression = cb.in(root.get(Computer_.employeeEntity));
for (Long id : emplIds) {
    Employee e = new Employee(id);
    inExpression = inExpression.value(e);
}
list.add(inExpression);

正在使用 Hibernate,它正在抛出 ObjectDB:

com.objectdb.o.UserException: Unexpected query token ':l2'
at com.objectdb.o.MSG.d(MSG.java:61)
at com.objectdb.o.TKN.J(TKN.java:765)
at com.objectdb.o.QNF.B(QNF.java:894)
at com.objectdb.o.QNF.I(QNF.java:1294)
at com.objectdb.o.QNF.k(QNF.java:315)
at com.objectdb.o.QNF.H(QNF.java:1270)
at com.objectdb.o.QNF.k(QNF.java:210)
at com.objectdb.o.QNF.t(QNF.java:611)
at com.objectdb.o.QNF.t(QNF.java:605)
at com.objectdb.o.QNF.k(QNF.java:218)
at com.objectdb.o.QNF.j(QNF.java:135)
at com.objectdb.o.QRC.z(QRC.java:321)
at com.objectdb.o.QRC.v(QRC.java:212)
at com.objectdb.o.QRC.u(QRC.java:166)
at com.objectdb.o.QRM.U6(QRM.java:250)
at com.objectdb.o.MST.U6(MST.java:933)
at com.objectdb.o.WRA.U6(WRA.java:291)
at com.objectdb.o.WSM.U6(WSM.java:113)
at com.objectdb.o.STC.r(STC.java:449)
at com.objectdb.o.SHN.aj(SHN.java:489)
at com.objectdb.o.SHN.K(SHN.java:156)
at com.objectdb.o.HND.run(HND.java:132)
at java.lang.Thread.run(Unknown Source)

有人知道如何解决这些问题吗?

米兰

【问题讨论】:

    标签: jpa criteria jpql objectdb


    【解决方案1】:

    com.objectdb.o.UserException:意外的查询令牌'EXISTS'

    ObjectDB 不知道EXISTS。见http://www.objectdb.com/java/jpa/query/jpql/comparison

    相反,您可以使用IS NOT NULL 来验证存在。请注意,SELECT c FROM Computer c WHERE c.employeeEntity = e 必须返回单个实例而不是多行结果集。

    这不是 ObjectDB 问题,因为它植根于 SQL / sql 方言。

    https://stackoverflow.com/a/6808503/1549387

    com.objectdb.o.UserException:意外的查询令牌':l2'

    你能打印出这个的堆栈跟踪吗?它看起来像一个未知的命名参数。您能否将日志记录级别发送到 FINE 或 FINEST 以查看生成的 SQL?

    【讨论】:

    • 我已经发现 ObjectDB 不支持子查询,所以问题的第一部分已经解决了——我必须自己在 Java 代码中过滤它。我发布了第二个问题的堆栈跟踪。我将日志记录设置为尽可能低的级别,但我没有在其中看到任何 ObjectDB 消息。
    • 没有。 JPA 确实支持子查询!您正在使用 EXISTS,这不起作用。 JPA 提供者应该打印消息。因此你必须修改persistence.xml。
    • JPA 有,但 ObjectDB 没有:objectdb.com/database/issue/10。在这种情况下,JPA Provider 是 ObjectDB(没有 Hibernate 等)
    • 嗯,它不是 JPA 2.0。子查询在版本 2 中确实有效。由于您使用的是 JPA 1.0,因此很清楚。当您使用 ObjectDB 作为 JPA 提供者时,为什么在问题中标记 hibernate?要在 ObjectDB 中设置日志记录,请参阅objectdb.com/java/jpa/setting/general
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2013-08-23
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 2018-02-22
    相关资源
    最近更新 更多