EclipseLink/JPA 是不是有用于修改生成的 SQL 的插件框架?

Posted

技术标签:

【中文标题】EclipseLink/JPA 是不是有用于修改生成的 SQL 的插件框架?【英文标题】:Does EclipseLink/JPA have a plugin framework for modifying generated SQL?EclipseLink/JPA 是否有用于修改生成的 SQL 的插件框架? 【发布时间】:2019-11-22 19:30:59 【问题描述】:

背景:总是让 ORM 用户搞砸的一件事是 SQL 中的 null 与 99% 的编程语言(主要是 null == null)的处理方式非常不同SQL。

EclipseLink 不会将空的绑定参数转换为正确的IS NULL,而是犯WHERE table.field = null 错误。

SQL 有一个空安全比较运算符:https://twitter.com/gabidavila/status/1101987501923811328

我们想以某种方式更改 SQL 的生成,使其始终在 where 子句中使用 <=> 运算符。 EclipseLink 中是否有工具可以执行此操作?我们能否以某种方式扩展其中一种方言?

另一种方法是为每一个比较写这样的东西,哎呀。

(agentRef = :agentRef OR agentRef IS NULL AND :agentRef IS NULL)

谢谢!

【问题讨论】:

您可以指定一个 DatabasePlatform 类,并在其中添加您需要的任何运算符。有关如何为 SQLServer DB 设置特定运算符的示例,请参阅 SQLServerPlatform initializePlatformOperators 方法。您可能希望使用可用于数据库的任何运算符覆盖 addOperator(simpleRelation(Equal, "=", "equal"))。 你能把你的评论变成一个答案,这样我就可以给你信用了吗?谢谢! 完成,虽然这不是一个很好的答案。我会看看我是否可以稍后再回来扩展它,或者随时发布您自己的解决方案作为答案 - 您最终使用的详细细节更有可能帮助别人而不是我的。 【参考方案1】:

您可以指定一个 DatabasePlatform 类,并在其中添加您需要的任何运算符。有关如何为 SQLServer DB 设置特定运算符的示例,请参阅 SQLServerPlatform initializePlatformOperators 方法。您可能希望使用可用于数据库的任何运算符来覆盖 addOperator(simpleRelation(Equal, "=", "equal"))。

【讨论】:

以上是关于EclipseLink/JPA 是不是有用于修改生成的 SQL 的插件框架?的主要内容,如果未能解决你的问题,请参考以下文章

JPA 使用指南 /Eclipselink/JPA 实体生成器

EclipseLink + JPA + 通用实体 + SINGLE_TABLE 继承

使用 EclipseLink JPA 将 XML 类型存储到 PostgreSQL

JPA 2.0 如何处理死锁(Eclipselink JPA2.0 MySQL)

在 OSGI (Karaf) 中使用 EclipseLink JPA

使用eclipselink jpa的未知列错误