Java 如何使用Hibernate/JPA调用返回字符串的Oracle函数?

Java 如何使用Hibernate/JPA调用返回字符串的Oracle函数?,java,hibernate,jpa,Java,Hibernate,Jpa,我想使用JPA调用Oracle函数。我在这个话题上找到了答案 但是我的Oracle函数只返回一个字符串。不是某种实体的结果。我试过这样的方法: 当我这样调用查询时 我明白了 有什么想法吗?我们最终使用了。它是有效的,但是告诉我是否有更好的解决方案 String funcCall = "{? = call schema.mypkg.somefunc(?)}"; Connection conn = ((SessionImpl)em.getDelegate()).connection(); Ca

我想使用JPA调用Oracle函数。我在这个话题上找到了答案

但是我的Oracle函数只返回一个字符串。不是某种实体的结果。我试过这样的方法:

当我这样调用查询时

我明白了


有什么想法吗?

我们最终使用了
。它是有效的,但是告诉我是否有更好的解决方案

String funcCall = "{? = call schema.mypkg.somefunc(?)}";
Connection conn = ((SessionImpl)em.getDelegate()).connection();
CallableStatement stmt = conn.prepareCall(funcCall);
stmt.setInt(2, 42);
stmt.registerOutParameter(1, Types.CHAR);
stmt.executeUpdate();
String result = stmt.getString(1);

我用一种相当粗糙的方法,你必须返回一个refcursor。因此,请确保函数返回ref游标,并执行如下操作:

result_string := doSoemthing
    open l_refcursor for select result_string as str from dual;
    return l_refcursor;
然后创建一个“虚拟”实体

您还可以使用本机查询功能

@NamedNativeQueries({
        @javax.persistence.NamedNativeQuery(name = "whatevs", query = "" +
                "{? =  call myfunction(:id)}", resultClass = NativeString.class,
                hints = {
                        @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true")
                }

        )

})

这是最丑陋的。。。hierbnate、存储过程和函数没有很好的解决方法。

你有没有找到任何适合的方法,我也一起黑了其他东西?没有,不幸的是,它仍然与下面一样。
String funcCall = "{? = call schema.mypkg.somefunc(?)}";
Connection conn = ((SessionImpl)em.getDelegate()).connection();
CallableStatement stmt = conn.prepareCall(funcCall);
stmt.setInt(2, 42);
stmt.registerOutParameter(1, Types.CHAR);
stmt.executeUpdate();
String result = stmt.getString(1);
result_string := doSoemthing
    open l_refcursor for select result_string as str from dual;
    return l_refcursor;
@Entity
public class NativeString {
    private String str;

    @Id
    @Column(name = "str")
    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
}
@NamedNativeQueries({
        @javax.persistence.NamedNativeQuery(name = "whatevs", query = "" +
                "{? =  call myfunction(:id)}", resultClass = NativeString.class,
                hints = {
                        @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true")
                }

        )

})