2017-06-20 75 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 {...}