Java 如何使用Hibernate/JPA调用返回字符串的Oracle函数?
我想使用JPA调用Oracle函数。我在这个话题上找到了答案 但是我的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
有什么想法吗?我们最终使用了
。它是有效的,但是告诉我是否有更好的解决方案
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")
}
)
})