本节列出了与 Java Persistence API 相关的已知问题和相应的解决方案。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=572。
请勿使用此类型的查询。
查询编译器不会检查 Java Persistence 语言的规范一章中定义的所有规则。特别是,它不检查以下各项:
函数参数的类型兼容性。
运算符、逻辑运算符和比较运算符的操作数的类型兼容性。
SELECT 子句对 ORDER BY 查询的要求。
无效的查询可能会进行编译,但可能会导致在运行时出现 SQLException。或者也可能出现以下情况:基础数据库比较宽松且支持 SQL,但在其他数据库上执行相同查询时会失败,并出现 SQLException。
手动验证上述条件。
如果查询按 JOIN 变量分组且直接选择 JOIN 变量,则可能会导致 SQLException 报告选定的表达式未分组。有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=197。例如:
SELECT AVG(o.totalPrice), c FROM Order o JOIN o.customer c GROUP BY c |
可能的解决方法是直接浏览此关系,而不是定义 JOIN 变量,例如:
SELECT AVG(o.totalPrice), o.customer FROM Order GROUP BY o.customer |
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=550。
手动验证查询中的哪些内容是错误的。
使用不同的类名称。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=558。
请勿明确地列出 MappedSuperclass。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=578。
请勿在子类中使用 ManyToMany 关系。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=557。
使用 java.util.Collection 代替。
通过使用 Java 包装对象类型,映射到可为 null 的数据库列。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=404。
在将实例返回到客户机之前,以服务器端代码访问 LAZY 初始化关系。
如果查询选择关系字段,则在关系字段值为 null 时查询结果中不包括 null 值。而会在查询结果中遗漏此条目,例如:
SELECT o.customer FROM Order o WHERE ... |
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=637。
从相关实例中选择状态字段。
SELECT o.customer.customerId FROM Order o WHERE ... |
例如:
SELECT c FROM Order o LEFT OUTER JOIN o.customer c |
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=638。
从相关实例中选择状态字段。
SELECT c.customerId FROM Order o LEFT OUTER JOIN o.customer c |
如果主键类由 @IdClass 注释定义,EntityManager.find() 会对作为其他实体子类的实体错误地抛出 IllegalArgumentException。有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=595。
将最顶层超类的类用作 find() 方法的参数,并将结果强制转换为子类。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=643。
将 java.util.ArrayList 用作初始值。