是否可以在 JPA 条件 API 中加入 db-function 输出?
Is it possible to join db-function output in JPA criteria API?
让我们假设我的 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 支持。
让我们假设我的 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 支持。