是否可以将JPA实体映射到存储过程(函数)?

时间:2017-06-20 10:09:41

标签: java sql postgresql hibernate jpa

我需要将JPA实体映射到返回表的Postgres函数。 所以每次当我查询这个实体时,它都会自动调用这个函数。可能吗? 也许@NamedNativeQuery可以提供帮助吗?

可能是this之类的东西?

3 个答案:

答案 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);