2017-06-20 72 views
0

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

类似this也许?

+0

在命名查询您的对象只是一个快捷方式,它使您只需编写一次查询,并且每次使用时都可以不用再次写入。 – Frank

+0

实体映射到表或视图。就这些。 FUNCTION的结果可以映射到DTO,就像任何查询可以是 –

+0

我认为这足以将表名称设置为函数,但我不确定是否每次都会调用 – XtremeBaumer

回答

-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); 
+0

这与问的问题并没有太大关系,因为它明白的sql和hibernate都没有,jpa – XtremeBaumer

2

如果你的函数没有任何参数,你可以将其封装在一个观点:

CREATE VIEW my_entity_procedure AS 
    SELECT 'Id:' || i AS some_field, i FROM generate_series(0, 100) i; 

然后将其映射到只读实体(@Immutable)。

我同意,这很奇怪,我不推荐这种方法。请记住,您可以使用ResultTransformer将对象列表(本例中为DTO)中的ResultSet变换为原始。像下面必须的东西的工作原理:

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(); 
}  
+0

我已经想过了查看方法。但是我的功能需要接受参数。 –

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 {...}