hibernate - 是否可以在 JPA 标准 API 中加入 db-function 输出?
问题描述
假设我的 JPA 标准 API 生成类似于以下 SQL 的内容:
SELECT * FROM a WHERE myCustomDbFunction(a.col) > "abc" order by myCustomDbFunction(a.col) asc;
函数调用是使用创建的criteriaBuilder.function
,返回一个Expression<String>
然后我可以在 where 和 order by 子句中使用它。查询工作正常,但 db 函数被调用两次(在更复杂的查询中甚至更频繁),这对性能非常不利。
在 SQL 中,我可以简单地这样做:
SELECT * FROM a, myCustomDbFunction(a.col) as myValue WHERE myValue > "abc" order by myValue asc;
或者这个:(两者都具有相同的性能,根据explain
:
SELECT * FROM a CROSS JOIN myCustomDbFunction(a.col) myValue WHERE myValue > "abc" order by myValue asc;
但是,在 Criteria API 中,我没有找到执行此操作的方法,因为我似乎只能将实体属性用于连接。
有什么方法可以避免使用 JPA 标准 API 多次调用该函数?还是只能使用自定义 SQL?
解决方案
是什么让你认为多次列出函数会导致它被多次执行?SQL 是声明性的,因此引擎只能评估“稳定”函数一次。请参阅此处了解 PostgreSQL 如何定义稳定函数的概念:https ://www.postgresql.org/docs/10/xfunc-volatility.html
不确定您要在这里解决什么样的问题,但是将函数放在交叉连接中是 AFAIK 不是标准功能,因此 Hibernate 或 JPA 也不支持。
推荐阅读
- sql - (Oracle) SQL 中的正则表达式将日期/时间拆分为单独的日期和时间列
- selenium-chromedriver - 如何修复这个 org.openqa.selenium.remote.ProtocolHandshake createSession?
- algorithm - 该算法是否用于计算正整数、n、O(1) 或 O(log n) 时间内设置的位数?
- php - 更新列名中包含特殊字符的数据时,数据表编辑器会出错
- cron - 如何使用默认队列在本地查看我的 sidekiq 控制台输出?
- mysql - 从命令行打开mysql的麻烦
- c - Linux kernel function call flow
- angular - CDK 拖放无法正确更改图像的位置
- windows - 在 Windows 上记录 USB 设备
- css - 将规则应用于同一级别中的所有节点,最后一行中的节点除外