我正在使用JPQL select来访问Oracle DB函数:select FUNCTION('function_name', 'foo', 1234) from com_mycompany_bar obj
这按预期工作,确实调用了该函数。问题是我实际上不需要FROM
子句,而是希望它为空,而不是为了符合语法而必须访问实体。
我在这里有什么最好的选择?
答案 0 :(得分:4)
我看到几个可能的答案:
在标准JPA中,有两个选项,都涉及Oracle DUAL
“table”
DUAL
映射到实体并在FROM
子句中使用它。这是更“JPQL”的方式,但它涉及的更多:在Java代码中:
@Entity(name = "Dual")
@Table(name = "SYS.DUAL")
public class Dual {
@Id
@Column(name = "DUMMY")
private String dummy;
}
在orm.xml中:
<named-query name="yourQuery">
<query><![CDATA[
SELECT FUNCTION('function_name', 'foo', 1234) FROM Dual d
]]>
</query>
</named-query>
在客户代码中:
Query q = entityManager.createNamedQuery("yourQuery");
DUAL
在orm.xml中:
<named-native-query name="yourQuery">
<query><![CDATA[
SELECT function_name('foo', 1234) from sys.dual
]]>
</query>
</named-native-query>
在客户代码中:
Query q = entityManager.createNativeQuery("yourQuery");
作为最后一个选项,您可以对JPA使用一些JPA实现扩展,并避免使用DUAL
:
的EclipseLink:
休眠:
答案 1 :(得分:0)
简而言之:我不认为可以跳过JPQL查询的FROM子句。
JPQL语法需要 FROM子句(请参阅例如here或here)。
调用存储过程/函数通常通过本机查询完成(请参阅:createNativeQuery)。所以这应该有效:
em.createNativeQuery("select function_name('foo', 1234)").getSingleResult()
更新(来自评论):
JPA原生查询不支持命名参数。所以你必须决定哪两个是你的两个邪恶中的较小者:使用不必要的实体引用的JPQL或者使用位置参数而不是命名的本机查询。
但请注意,FUNCTION是EclipseLink扩展,因此如果您决定更换供应商,它将无法工作。