我需要将JPA实体映射到返回表的Postgres函数。 所以每次当我查询这个实体时,它都会自动调用这个函数。可能吗? 也许@NamedNativeQuery可以提供帮助吗?
可能是this之类的东西?
答案 0 :(得分:2)
如果您的函数没有任何参数,您可以将其封装在视图上:
CREATE VIEW my_entity_procedure AS
SELECT 'Id:' || i AS some_field, i FROM generate_series(0, 100) i;
然后将其映射到只读实体(@Immutable
)。
我同意,这很奇怪,我不推荐这种方法。请记住,您可以使用ResultTransformer
转换对象列表中的原始 ResultSet(在本例中为DTO)。像下面这样的东西必须有效:
public List<MyFunctionDTO> getAllFromMyFunction() {
StringBuilder sql = new StringBuilder("SELECT i FROM generate_series(0, 100) i");
Query query = getHibernate().getSession().createSQLQuery(sql.toString());
query.setResultTransformer(Transformers.aliasToBean(MyFunctionDTO.class));
return query.list();
}
答案 1 :(得分:0)
我不知道Postgres的限制,但使用JPA 将实体映射到存储过程的一般规则是here:
@Entity
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(
name = "myNamedProcedure",
procedureName = "SP_NAME",
resultClasses = { MyEntity.class },
parameters = {
@StoredProcedureParameter(
name = "parameter1",
type = Integer.class,
mode = ParameterMode.IN) ... })
})
public class MyEntity {...}
答案 2 :(得分:-1)
您可以使用 CallableStatement
con 是您的连接对象
CallableStatement cs = con.prepareCall("{call your_procedure()}");
如果你有参数:
CallableStatement cs = con.prepareCall("{call your_procedure(?,?)}");
实施例
cs.setString(1,your_param);
如果你想获得结果:
示例
cs.registerOutParameter(2, Types.INTEGER);