我需要将JPA实体映射到返回表的Postgres函数。 所以每当我查询这个实体时,它都会自动调用这个函数。可能吗? 也许@NamedNativeQuery可以提供帮助吗?是否有可能将JPA实体映射到存储过程(函数)?
类似this也许?
我需要将JPA实体映射到返回表的Postgres函数。 所以每当我查询这个实体时,它都会自动调用这个函数。可能吗? 也许@NamedNativeQuery可以提供帮助吗?是否有可能将JPA实体映射到存储过程(函数)?
类似this也许?
您可以使用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);
这与问的问题并没有太大关系,因为它明白的sql和hibernate都没有,jpa – XtremeBaumer
如果你的函数没有任何参数,你可以将其封装在一个观点:
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();
}
我已经想过了查看方法。但是我的功能需要接受参数。 –
我不知道的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 {...}
在命名查询您的对象只是一个快捷方式,它使您只需编写一次查询,并且每次使用时都可以不用再次写入。 – Frank
实体映射到表或视图。就这些。 FUNCTION的结果可以映射到DTO,就像任何查询可以是 –
我认为这足以将表名称设置为函数,但我不确定是否每次都会调用 – XtremeBaumer