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)