首页 > 解决方案 > 是否可以在 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?

标签: hibernatejpahibernate-criteria

解决方案


是什么让你认为多次列出函数会导致它被多次执行?SQL 是声明性的,因此引擎只能评估“稳定”函数一次。请参阅此处了解 PostgreSQL 如何定义稳定函数的概念:https ://www.postgresql.org/docs/10/xfunc-volatility.html

不确定您要在这里解决什么样的问题,但是将函数放在交叉连接中是 AFAIK 不是标准功能,因此 Hibernate 或 JPA 也不支持。


推荐阅读